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