复习 JavaScript 原型链
原型链是 JavaScript 里面很基础的概念,面试中和工作中也经常遇到,但是有的时候用起来还是会犹豫一下。尤其是存在继承关系的时候,有时候搞不清楚对象的原型是谁,这里来结合实验详细的梳理一下。
假设我们有一个 Person
类(构造函数)
1 | class Person { |
我们用 new 操纵符构造一个新的对象 person
1 | let person = new Person() |
那么 person
对象和 Person
的原型链是什么样的呢
person.__proto__
指向Person.prototype
person.constructor
指向Person
类,因为该对象的构造函数就是Person
person.constructor.prototype
也就是Person.prototype
Person.prototype.constructor
指向Person
自己Person.constructor
指向Function
Person.__proto__
指向Function.prototype
至此,Person 类和它的实例对象的原型链基本分析完毕了,接下来我们顺着这条链一直走到底来看一下。
Person.prototype.__proto__
指向Object.prototype
Object
实例对象的constructor
指向Object.prototype.constructor
Object.prototype.__proto__
是null
下面上一张完整的图,看了这张图,对 js 的原型链就可以一目了然了
总结下就是:
- 实例对象的
__proto__
指向类(构造函数)的prototype
- 实例对象的
constructor
指向类(构造函数)本身 - 类(构造函数)的
__proto__
指向父类或者Function
的prototype
Function
的基类是Object
- 特别的
Object.__proto__
指向一个空函数 - 特别的
Object.property.__proto__
是null