前言
经典JavaScript原型继承关系图。看起来很复杂,当内存图一出手,就知有没有了。怎么画原型内存图?可以先看看《JavaScript面向对象-ES5实现继承》一文。
一、手写原型继承关系图
首先明确几个点(重点):
函数对象和原型对象都是对象,是对象就会有__proto__属性。构造函数对象会有prototype属性。原型对象会有constructor属性。
开始咯:
- 通过构造函数Person创建对象(黄色线条)
function Person () {}
var p1 = new Person()
Person函数对象原型的隐式原型(绿色线条)
- 因为
函数对象也是对象,是由new Object()创建出来的。所以Person函数原型对象的隐式原型指向构造函数Object的显式原型。 Object函数也有对应的显式原型。
Person构造函数的隐式原型(蓝色线条)
- 构造函数
Person是由new Function()创建出来的,所以Person函数对象的隐式原型指向构造函数Function的显式原型。 Function函数原型对象由new Object()创建,所以它的隐式原型指向Object函数原型对象。- 构造函数
Object也是由new Function()创建出来的,所以Object函数对象的隐式原型指向构造函数Function的显式原型。 - 构造函数
Function也是由new Function()创建出来的,所以Function函数对象的隐式原型指向构造函数Function的显式原型。
- 构造obj实例对象(荧光蓝色线条)
var obj = {}
obj对象由new Object()创建,所以obj对象的隐式原型指向Object函数原型对象。
- 总结
p1是Person的实例对象。obj是Object的实例对象。Function/Object/Person都是Function的实例对象。- 原型对象默认创建时(如果不改动),隐式原型都是指向
Object的显式原型。Object的隐式原型指向null。- 推导结论:
Object是Person/Function的父类。
- 推导结论:
注:Object是Function的父类,而Function又是Object的构造函数。