function Polygon(iSides) { this.sides = iSides; if(typeof Polygon._initialized == "undefined") { Polygon.prototype.getArea = function() { return 0; }; Polygon._initialized = true; } } function Triangle(iBase,iHeight) { Polygon.call(this,3); this.base = iBase; this.hei = iHeight; if(typeof Triangle._initialized == "undefined") { [color=red]Triangle.prototype = new Polygon(); [/color] Triangle.prototype.getArea = function() { return this.base * this.hei * 0.5; }; Triangle._initialized = true; } } [color=red]var oTriangle1 = new Triangle(12,4);[/color]
Nicholas解释说在代码运行前,对象已被实例,并与prototype联系,在当前对prototype对象替换不会对它产生任何影响,即当前的替换是访问不到的,只有未来对象的实例才会反映出这种改变。于是第一个实例对象就会不正确。但第二个及以后的子类实例都没问题。
也许是翻译的原因,我觉得解释过于简短,容易让人迷惑。我就思考了一下,现在我谈谈我的理解,不一定正确,欢迎拍砖、
我们知道,js里,函数是第一型,也就是说一个函数就是一个对象。
因此,function Triangle(iBase,iHeight)这个申明,其实就产生了一个对象,只是这个对象虽然叫Triangle,但是因为他的函数体还没有被执行过,所以他的prototype其实是Object。
当执行var oTriangle1 = new Triangle(12,4);时,我们又有了一个oTriangle1对象,但是因为构建对象的时候,函数体还是没有执行,所以oTriangle1的prototype仍然是Object。
接着,我们开始执行函数体,函数体里Triangle的prototype被赋值为new Polygon();所以Triangle的prototype成功修改,但是因为oTriangle1的prototype是Object,而不是Triangle,这个修改就变得与他毫无关系,所以oTriangle1没有被“正确”初始化。