把 js 代码看成是运行在 v8 环境里的对象
这个环境只有一个初始对象,Object,它同时也是 js 里的函数
环境有 4 个规则:
-
js 函数必有
.prototype
引用,它的目的是,为由该函数创建出来的实例,提供一个引用(__proto__
),能访问到定义在该函数的 prototype 上的属性(简单来说就是为 js 实现实例化或继承而服务,觉得绕口直接看 2) -
若对象 a 由对象 A 创造而来(
a = new A()
),则有a.__proto__ === A.prototype
-
所有 js 函数都是由
Function.prototype
创造而来 -
所有 js 函数的
prototype
都是Object.prototype
创造而来,由于Object
是 v8 环境自带的初始化对象,即使它是个函数,但Object.prototype
并不由Object.prototype
创造
由于 Object 和 Function 都是函数,根据上面的规则,可以得到:
-
Object.__proto__ === Function.prototype
(规则 3) -
Function.__proto__ === Function.prototype
(规则 3) -
A = function(){},则 A.__proto__ === Function.prototype
(规则 3) -
Function.prototype.__proto__ === Object.prototype
(规则 4) -
Object.prototype.__proto__ === null
(规则 4) -
若
A = function() {}
,等价于A = new Function()
;然后a = new A()
。 则有a.__proto__.__proto___ === A.prototype.__proto___ === Object.prototype
(规则 4)