Skip to content

面试题-原型链

某大厂遇到一个原型链的面试题。突然发现自己对原型链理解还是不够

题目

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:

  1. 首先 f 是 F 的实例,那么通过new 的原理可以知道 f.__proto__ === F.prototype . 继续向下找
  2. F.prototype.__proto__ === Object.prototype 因此 f.b() 肯定可以找到,而 f.a() 并在 f 的查找链上因此会报错没有这个方法

再看大 F

  1. F.__proto__ ===Function.prototype 因此 F.a() 可以找到. 继续向下找
  2. Function.prototype.__proto__ === Object.prototype 因此 F.b() 可以找到

结果

误区

千万不要直接认为 F 的原型链上有 Function.prototype 。而 f.__proto__指向 F.prototype ,就想当然的认为 ~f 的原型链上也有 Function.prototyp~ 。js 是严格按照__proto__向上查找的. 这是在两条不同的链上的东西!.