首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-10-12 
为什么继承的时候动态原型无效function Polygon(iSides) { this.sides iSides if(typeof Polygon._init

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

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没有被“正确”初始化。

热点排行