构造函数
混合的构造函数/原型方式
<html>
<body>
<script type="text/javascript">
function Car(sColor,oDoor,mTitle)
{
this.color= sColor;
this.door=oDoor ;
this.title= mTitle;
}
Car.prototype.showColor=function(){
alert(this.color);
};
car1=new Car("red",4,"汽车1");
car2=new Car("blue",2,"汽车2");
car2.showColor();
car1.color="xxx";
alert(car1.color);
car1["color"]="yyy";//和car1.color写法相同
alert(car1["color"]);
</script>
</body>
</html>
动态原型方法
<html>
<body>
<script type="text/javascript">
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;
}
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
document.write(oCar1.drivers);
document.write("<br />")
document.write(oCar2.drivers);
</script>
</body>
</html>
动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。下面是用动态原型方法重写的 Car 类:
直到检查 typeof Car._initialized 是否等于 "undefined" 之前,这个构造函数都未发生变化。这行代码是动态原型方法中最重要的部分。如果这个值未定义,构造函数将用原型方式继续定义对象的方法,然后把 Car._initialized 设置为 true。如果这个值定义了(它的值为 true 时,typeof 的值为 Boolean),那么就不再创建该方法。简而言之,该方法使用标志(_initialized)来判断是否已给原型赋予了任何方法。该方法只创建并赋值一次,传统的 OOP 开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了。
采用哪种方式
如前所述,目前使用最广泛的是混合的构造函数/原型方式。此外,动态原始方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。

浙公网安备 33010602011771号