<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() 创建的对象都是 ‘普通对象’