Bootstrap

Javascript的面向对象语法

面向对象语言的要求:封装,聚集,继承,多态

对象的创建与销毁都在JavaScript执行的过程中发生

 

预定义对象:

声明和实例化

<span style="font-family:FangSong_GB2312;font-size:14px;">var oObject = new Object();
var oStringObject = new String();
</span>

如果构造函数无参数,括号不是必须的,即可以写成

<span style="font-family:FangSong_GB2312;font-size:14px;">var oObject = new Object;
var oStringObject = new String;
</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">oObject=null;//废除对象需要将它所有的引用设置为null</span>

Object 对象属性:

constructor
对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。
Prototype
对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。

方法:

hasOwnProperty(property)
判断对象是否有某个特定的属性。必须用字符串指定该属性。(如,o.hasOwnProperty("name"))
IsPrototypeOf(object)
判断该对象是否为另一个对象的原型。
PropertyIsEnumerable
判断给定的属性是否可以用 for...in 语句进行枚举。
ToString()
返回对象的原始字符串表示。对于 Object 对象,ECMA-262 没有定义这个值,所以不同的 ECMAScript 实现具有不同的值。
ValueOf()
返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

上面列出的每种属性和方法都会被其他对象覆盖。

ECMAScript 中,可以创建并使用的对象:本地对象,内置对象,宿主对象

本地对象:Object,Function,Array,String,Boolean,Number,Date,RegExp,Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError

内置对象:Global,Math 已经被实例化

宿主对象:所有非本地对象,所有BOM,DOM

关键字this总指向调用它的方法

 

自定义对象

构造函数方式:

<span style="font-family:FangSong_GB2312;font-size:14px;">function Car(iMpg) {
  this.mpg = iMpg;
  this.showColor = function() {
    alert(this.color);
  };
}

var oCar1 = new Car(23);
var oCar2 = new Car(25);</span>

 

原型方式

<span style="font-family:FangSong_GB2312;font-size:14px;">function Car() {
}

Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.drivers = new Array("Mike","John");
Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car();
var oCar2 = new Car();

oCar1.drivers.push("Bill");

alert(oCar1.drivers);	//输出 "Mike,John,Bill"
alert(oCar2.drivers);	//输出 "Mike,John,Bill"
</span>


混合的构造函数/原型方式

<span style="font-family:FangSong_GB2312;font-size:14px;">function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
}

Car.prototype.showColor = function() {
  alert(this.color);
};

var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);

oCar1.drivers.push("Bill");

alert(oCar1.drivers);	//输出 "Mike,John,Bill"
alert(oCar2.drivers);	//输出 "Mike,John"
</span>

 

动态原型方法

<span style="font-family:FangSong_GB2312;font-size:14px;">function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
  
  if (typeof Car._initialized == "undefined") {
    Car.prototype.showColor = function() {
      alert(this.color);
    };
	
    Car._initialized = true;
  }
}
</span>

 

混合工厂方式

<span style="font-family:FangSong_GB2312;font-size:14px;">function Car() {
  var oTempCar = new Object;
  oTempCar.color = "blue";
  oTempCar.doors = 4;
  oTempCar.mpg = 25;
  oTempCar.showColor = function() {
    alert(this.color);
  };

  return oTempCar;
}
</span>
<span style="font-family:FangSong_GB2312;font-size:14px;">var car = <span style="color:red;">new</span> Car();</span>


prototype 属性定义构造函数的属性和方法,为本地对象添加属性和方法。

<span style="font-family:FangSong_GB2312;font-size:14px;">Array.prototype.enqueue = function(vItem) {
  this.push(vItem);
};
</span>


继承

对象冒充

<span style="font-family:FangSong_GB2312;font-size:14px;">function ClassB(sColor, sName) {
    this.newMethod = ClassA;
    this.newMethod(sColor);
    delete this.newMethod;

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}
</span>

call() 方法

<span style="font-family:FangSong_GB2312;font-size:14px;">function ClassB(sColor, sName) {
    ClassA.call(this, sColor);

    this.name = sName;
    this.sayName = function () {
        alert(this.name);
    };
}
</span>

原型链

<span style="font-family:FangSong_GB2312;font-size:14px;">function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();
</span>


 

;