共计 1105 个字符,预计需要花费 3 分钟才能阅读完成。
一、题目
我们先看一道题目
var F = function() {};
Object.prototype.a = function() {
console.log(‘a’);
};
Function.prototype.b = function() {
console.log(‘b’);
}
var f = new F();
f.a();
f.b();
F.a();
F.b();
二、解题关键
借用网络上的图片,看起来有点绕,待我们一点一点理解。有以下几点:
三、图片解析
__proto__ 是原型链的链接
通过 __proto__ 查找到 prototype,prototype 是原型的关键字
var f = new F() f: 是实例对象 F:是构造函数 f 通过__proto__ 找到 F.prototype, 所以 f.__proto__ === F.prototype
构造器的原型属于对象 Object,也就是说 F.prototype 是 new object 出来的。所以 F.prototype 通过 __proto__ 可以找到 Object.prototype 即:F.prototype.__proto__ === Object.Prototype
function Function() 是函数构造器 Function.__proto__ === Function.prototypeFunction.prototype 是对象, 所以 Function.prototype.__proto__ === Object.prototype
终极:Objecy.prototype.__proto__ === null
四、题目解析
再回过头来看上面的题目
f.a(),f 是实例对象,f 没有 a 属性,通过 f.__proto__找到原型 F.prototype,F.prototype 上也没有 a 属性,继续通过 F.prototype.__proto__找到 Object.prototype, 发现 a 属性,所以输出 a
f.b(),同理找到 Object.prototype, 发现 Object.prototype 也没有 b 属性,继续通过__proto__查找 到了 null,所以 b 函数不存在,浏览器报错。则 F.a(),F.b() 也不会执行
若注释了 f.b(),执行 F.a()。F 是函数,F 上没有 a 属性,通过__proto__找到 Function.prototype,发现 Function.prototype 没有 a 属性,继续通过__proto__, 找到 Object.prototype, 找到了 a 属性,输出 a
若注释了 f.b(),执行 F.b()。同理找到 Function.prototype,发现 b 属性,输出 b
五、参考资料
JS 原型与原型链
如果有理解不对的地方,欢迎大佬指正!