问题描述
function Polygon() { Polygon.prototype.getArea = function () { return 0; } } function Triangle() { Triangle.prototype = new Polygon(); } var triangle = new Triangle(); alert(triangle.getArea()); var triangle1 = new Triangle(); alert(triangle1.getArea()); 这段代码打不出东西来,如果我把alert(triangle.getArea());去掉, alert(triangle1.getArea());就可以打出来 这是为什么啊 ,也就是要在第2次实例化Triangle时才能打出来"OK". 或者代码改成如下: function Polygon() { Polygon.prototype.getArea = function () { return "OK"; } } function Triangle() { } Triangle.prototype = new Polygon(); var triangle = new Triangle(); alert(triangle.getArea()); var triangle1 = new Triangle(); alert(triangle1.getArea()); 这样就正常了,Triangle.prototype = new Polygon();这行代码写在函数里面和外面有什么区别呢 请问下这是为什么问题补充:哈哈 我就是看了这本书 就是对书上的这个解释不明白才用的但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变这个我不知道怎么理解
解决方案
未调用new Triangle()时,由于Triangle()中的构造函数还没有执行,所以Triganle对象的prototype并未改变。这时使用new Triangle()创建的对象,是原始的Triangle对象。而调用过一次new Triangle()后,Traingle.prototype=new Polygon()被执行。Triangle的prototype被改变了。所以再次new Triangle()创建的就是改变之后的Triangle对象。对此,楼主可以参照下面这个例子测试一下。var i=0;//标识是第几次生成的Traingle对象。function Polygon() {Polygon.prototype.getArea = function (){return "Polygon getArea()";}}function OtherPolygon() {OtherPolygon.prototype.getArea = function (){return "OtherPolygon getArea()";}}function Triangle() {if(i==0){Triangle.prototype = new Polygon();}else if(i==1){Triangle.prototype = new OtherPolygon();}i++;}Triangle.prototype.getArea = function(){return "Triangle getArea()";}var triangle1 = new Triangle();//第一次生成时,使用的是原始的prototype,结果为"Traingle getArea()",//并执行了Triangle.prototype = new Polygon();语句。alert(triangle1.getArea());var triangle = new Triangle();//第二次生成时,使用的是修改后的prototype(new Polygon()),结果为"Polygon getArea()",//并执行了Triangle.prototype = new OtherPolygon();语句。alert(triangle.getArea());var triangle = new Triangle();//第三次生成时,使用的是修改后的prototype(new OtherPolygon()),结果为"OtherPolygon getArea()",alert(triangle.getArea());
解决方案二:
直接修改prototype,不会影响他的实例,修改constructor的prototype的field才会改变实例
解决方案三:
LZ你把Triangle.prototype = new Polygon()这行代码写在构造函数里面从逻辑上讲,这个位置是正确的,但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变,这个是你第一个实例没有打印出来,而第二个实例打印出来的原因。因此按你这种方式继承的话,必须在构造函数外赋予新的prototype对象。LZ可以看看 《javascript高级程序设计》第4章,里面对js的继承做了详细的介绍。希望能对lz有所帮助