面向对象语言的要求:封装,聚集,继承,多态
对象的创建与销毁都在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>