liuhu2967 2008-08-26 13:43
浏览 230
已采纳

关于JS原型继承的问题

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();这行代码写在函数里面和外面有什么区别呢
请问下这是为什么
[b]问题补充:[/b]
哈哈 我就是看了这本书 就是对书上的这个解释不明白才用的
但从技术上说,在代码运行前,对象已被实例化,并与原始的prototype对象联系在一起了,虽然用极晚绑定可使对原型对象的修改正确的反映出来,但替换prototype对象却不会对该对象产生任何的影响,只有对未来的对象实例才会反映出这种改变
这个我不知道怎么理解

  • 写回答

3条回答 默认 最新

  • iteye_17163 2008-08-26 16:59
    关注

    未调用new Triangle()时,由于Triangle()中的构造函数还没有执行,所以Triganle对象的prototype并未改变。这时使用new Triangle()创建的对象,是原始的Triangle对象。
    而调用过一次new Triangle()后,Traingle.prototype=new Polygon()被执行。Triangle的prototype被改变了。所以再次new Triangle()创建的就是改变之后的Triangle对象。
    对此,楼主可以参照下面这个例子测试一下。
    [code="js"]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());[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型