复习 JavaScript 原型链

原型链是 JavaScript 里面很基础的概念,面试中和工作中也经常遇到,但是有的时候用起来还是会犹豫一下。尤其是存在继承关系的时候,有时候搞不清楚对象的原型是谁,这里来结合实验详细的梳理一下。

假设我们有一个 Person 类(构造函数)

1
2
3
4
class Person {		
foo () {
}
}

我们用 new 操纵符构造一个新的对象 person

1
let person = new Person()

那么 person 对象和 Person 的原型链是什么样的呢

  1. person.__proto__ 指向 Person.prototype

  2. person.constructor 指向 Person 类,因为该对象的构造函数就是 Person

  3. person.constructor.prototype 也就是 Person.prototype

  4. Person.prototype.constructor 指向 Person 自己

  5. Person.constructor 指向 Function

  6. Person.__proto__ 指向 Function.prototype

    至此,Person 类和它的实例对象的原型链基本分析完毕了,接下来我们顺着这条链一直走到底来看一下。

  7. Person.prototype.__proto__ 指向 Object.prototype

  8. Object 实例对象的 constructor 指向 Object.prototype.constructor

  9. Object.prototype.__proto__null

下面上一张完整的图,看了这张图,对 js 的原型链就可以一目了然了

构造函数原型链

总结下就是:

  1. 实例对象的 __proto__ 指向类(构造函数)的 prototype
  2. 实例对象的 constructor 指向类(构造函数)本身
  3. 类(构造函数)的 __proto__ 指向父类或者 Functionprototype
  4. Function 的基类是 Object
  5. 特别的 Object.__proto__ 指向一个空函数
  6. 特别的 Object.property.__proto__null