<aside> 💡 本文不是基础教程, 如果对原型的基础概念还不理解, 请先看看 ref 中的链接.
</aside>
先来看看基础概念:
__proto__
指向该对象的原型 (后面有解释), 通常是一个 ‘Object 原型对象’ (后图中的 A)__proto__
指向本函数对象的原型 (后面有解释), 通常是一个 ‘Function 原型对象’ (后图中的 B)prototype
的作用是: 该函数所创建对象后, 为被创建对象的 __proto__
赋值. 所以任何通过 new Xxx()
创建的对象的 __proto__
都等于 Xxx.prototype, 即 new Xxx().__proto__ === Xxx.prototype
__proto__
指向本对象的原型, 通常是一个 ‘Object 原型对象’ (后图中的 A)constructor
是个反向链接, 反过来指向构造函数对象 (见后图)有了上述基础, 我们来看一下 js 几个引擎内建对象的关系:
(红色是普通对象, 蓝色是函数对象)
首先, 引擎有个内建的 A 对象, 该对象:
__proto__ == null
. 也就是说: 本对象没有原型B 也是引擎内建对象:
__proto__
指向了 A. 换句话说: B 扩展了 A, 并增加了一些函数会用到的方法, 如下C 和 D 依然是引擎的内建对象, 不过这两个是内建的函数对象:
Object
(即 C 对象) 函数:
__proto__
指向 B, 即: Object
自身是一个函数对象prototype
指向 A, 即: 通过 new Object()
创建的对象都是 ‘普通对象’