当前位置: 代码迷 >> Web前端 >> 为何继承的时候动态原型无效
  详细解决方案

为何继承的时候动态原型无效

热度:355   发布时间:2012-10-12 10:17:04.0
为什么继承的时候动态原型无效
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没有被“正确”初始化。
  相关解决方案