面试题-原型链
某大厂遇到一个原型链的面试题。突然发现自己对原型链理解还是不够
题目
js
var F = function () {
console.log(1);
};
Function.prototype.a = function () {
console.log("a");
};
Object.prototype.b = function () {
console.log("b");
};
var f = new F();
f.a();
f.b();
F.a();
F.b();
// 输出啥?
// 错误答案: abab
分析
明显是考的原型链.那么顺着原型链向上找:
先看小 f:
- 首先 f 是 F 的实例,那么通过new 的原理可以知道
f.__proto__ === F.prototype
. 继续向下找 F.prototype.__proto__ === Object.prototype
因此 f.b() 肯定可以找到,而 f.a() 并在 f 的查找链上因此会报错没有这个方法
再看大 F
F.__proto__ ===Function.prototype
因此 F.a() 可以找到. 继续向下找Function.prototype.__proto__ === Object.prototype
因此 F.b() 可以找到
误区
千万不要直接认为 F 的原型链上有 Function.prototype 。而 f.__proto__
指向 F.prototype ,就想当然的认为 ~f 的原型链上也有 Function.prototyp~ 。js 是严格按照__proto__
向上查找的. 这是在两条不同的链上的东西!.