构造函数

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

<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 开发者会高兴地发现,这段代码看起来更像其他语言中的类定义了。

 

采用哪种方式

如前所述,目前使用最广泛的是混合的构造函数/原型方式。此外,动态原始方法也很流行,在功能上与构造函数/原型方式等价。可以采用这两种方式中的任何一种。不过不要单独使用经典的构造函数或原型方式,因为这样会给代码引入问题。

posted @ 2011-09-21 10:15  穹天  阅读(165)  评论(0编辑  收藏  举报