手写JavaScript原型继承关系图

106 阅读2分钟

前言

2704bc80e5a72c6731381d65cdbc45b.png

经典JavaScript原型继承关系图。看起来很复杂,当内存图一出手,就知有没有了。怎么画原型内存图?可以先看看《JavaScript面向对象-ES5实现继承》一文。

一、手写原型继承关系图

首先明确几个点(重点):

  • 函数对象原型对象都是对象,是对象就会有__proto__属性。
  • 构造函数对象会有prototype属性。
  • 原型对象会有constructor属性。

开始咯:

  1. 通过构造函数Person创建对象(黄色线条)
function Person () {}
var p1 = new Person()

image.png

  1. Person函数对象原型的隐式原型(绿色线条)
  • 因为函数对象也是对象,是由new Object()创建出来的。所以Person函数原型对象的隐式原型指向构造函数Object的显式原型。
  • Object函数也有对应的显式原型。

image.png

  1. Person构造函数的隐式原型(蓝色线条)
  • 构造函数Person是由new Function()创建出来的,所以Person函数对象的隐式原型指向构造函数Function的显式原型。
  • Function函数原型对象由new Object()创建,所以它的隐式原型指向Object函数原型对象
  • 构造函数Object也是由new Function()创建出来的,所以Object函数对象的隐式原型指向构造函数Function的显式原型。
  • 构造函数Function也是由new Function()创建出来的,所以Function函数对象的隐式原型指向构造函数Function的显式原型。

image.png

  1. 构造obj实例对象(荧光蓝色线条)
var obj = {}
  • obj对象由new Object()创建,所以obj对象的隐式原型指向Object函数原型对象。

image.png

  1. 总结
  • p1Person的实例对象。
  • objObject的实例对象。
  • Function/Object/Person都是Function的实例对象。
  • 原型对象默认创建时(如果不改动),隐式原型都是指向Object的显式原型。Object的隐式原型指向null
    • 推导结论:ObjectPerson/Function的父类。

注:Object是Function的父类,而Function又是Object的构造函数。

附录

  1. 文章:JavaScript Object Layout