原型链问题 求大神

function fn() {
    this.a = 0;
    this.b = function() {
        alert(this.a)
    }
}
fn.prototype = {
    b: function() {
        this.a = 20;
        alert(this.a);
    },
    c: function() {
        this.a = 30;
        alert(this.a);
    }
}
var myfn = new fn();
myfn.b();
myfn.c();
构造函数和原型里面同样有方法b 变量为什么只有在构造函数里面有效?
阅读 2.6k
3 个回答

因为对象 obj 属性查找的规则是:

  1. 先在对象 obj 上查找,找到则直接返回该属性,结束查找

  2. 在对象的原型 obj.__propo__ 上查找,找到则直接返回该属性,结束查找

  3. 在原型的原型(原型链)上查找,找到则直接返回该属性,结束查找

  4. 重复第3步,直到原型指向null,结束查找,返回undefined

具体这个问题:myfn.b在对象属性上找到了,不需要去原型链上查找。

变量为什么只有在构造函数里面有效
这样理解是不正确的。
题主需要了解到一个概念是,JS在调用方法的时候,会先从实例上寻找该方法,如果没有时,才会往原型上找。
当实例与原型链拥有相同的方法名时,这个时候原型链上的方法是不会被调用到的
myfn.b()实际上是调用了构造函数里的function b
原型链上的b并没有被调用到

题主把问题复杂化了。

原型不应该只叫原型,更应该称他为原型链。这里的链是指链表,学过数据结构就明白,链接看起来就是这样子的:

图片描述

WOC,光看这图我都觉得没有什么可以说的了。

链表彼此之间是通过指针连接,记住是指针指针指针

那么,你的问题在一个链表里面去查找方法b的时候自然是从头一层层的往下找了。找到了,就执行,这说明为什么你的 prototype.b 永远不会执行到的原因了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题