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条)

报告相同问题?

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?