iteye_10167 2008-11-05 13:05
浏览 163
已采纳

JS prototype链的疑惑

为什么在A指定prototype后,其先前创建的实例没有得到prototype中的方法?
而奇怪的是,
var pc= new C();也是在定义prototype之前创建,但却可以获得prototype中的方法。

请指教,谢谢。

而另一方面,
[code="javascript"]
function A() {this.walk= function() {alert('I can walk');}}
function B() {this.swing= function() {alert('I can swing');}}
function C() {this.fly= function() {alert('I can fly');}}

var a= new A();
alert(a.fly == undefined);

var cp= new C();
B.prototype= cp;
A.prototype= new B();

var aa= new A();
aa.fly();
aa.swing();
alert(a.fly == undefined,);
C.prototype.jump= function() {alert('Jump');}
aa.jump(); //OK
alert(a.jump == undefined); //Why?
alert(pc.jump != undefined); //这里应该与a的情形相同,但确
[/code]

看了问题http://www.iteye.com/problems/3251 中的解释后
再尝试修改A.prototype

[code="javascript"]
A.prototype.jump= function() { alert("Self Jump"); };
alert(a.jump == undefined); //Why?
[/code]
奇怪的是aa.jump()被修改了,但a.jump依然不存在

  • 写回答

1条回答 默认 最新

  • iteye_17163 2008-11-05 17:55
    关注

    [url]http://www.iteye.com/problems/3251 [/url]
    :oops: 这个...这个,之前那个回答完全是根据自己的理解说的,可能误导了楼主吧.

    这个回答才更严谨一点.
    [quote=ggmmaallee]直接修改prototype,不会影响他的实例,修改constructor的prototype的field才会改变实例[/quote]

    也就是当你直接修改prototype的值的时候,是不会影响到之前所创建的实例的.但是如果修改prototype中的一个属性,就会影响到之前所创建的实例了.

    所以你下面的这段代码根本没有影响到a对象.
    var cp= new C();

    B.prototype= cp;

    A.prototype= new B();

    而在prototype被修改之后,再创建的aa对象,它所使用的是C的prototype了.
    而下面又修改了C的prototype中的jump属性.所以影响到了aa.

    ...不好意思了.之前那个回答误导你了.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘