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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀