构造函数
混合的构造函数/原型方式
<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 开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了。
采用哪种方式
如前所述,目前使用最广泛的是混合的构造函数/原型方式。此外,动态原始方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。