ES5关于Object
和Function
的规定:
从上面的规定再结合其它,理出以下几点:
Function.prototype
和Function.__proto__
为同一对象。
这意味着: Object
/Array
/String
等等构造函数本质上和Function
一样,均继承于Function.prototype
。
Function.prototype
直接继承root(Object.prototype
)。
通过这点我们可以弄清 继承的原型链:Object.prototype(root)
<---Function.prototype
<---Function|Object|Array...
。 如下图所示:
以上3点比较容易理解,或者说规范里就这样定义的。由以上3点导出我们最后的问题:Object
和Function
的鸡和蛋的问题。
回答这个问题,必须首先更深入一层去理解Function.prototype
这个对象,因为它是导致Function instanceof Object
和Object instanceof Function
都为true
的原因。
回归规范,摘录2点:
Function.prototype
是个不同于一般函数(对象)的函数(对象)。
The Function prototype object is itself a Function object (its [[Class]] is "Function") that, when invoked, accepts any arguments and returns undefined.
The value of the [[Prototype]] internal property of the Function prototype object is the standard built-in Object prototype object (15.2.4). The initial value of the [[Extensible]] internal property of the Function prototype object is true.
The Function prototype object does not have a valueOf property of its own; however, it inherits the valueOf property from the Object prototype Object.
Function.prototype
像普通函数一样可以调用,但总是返回undefined
。- 普通函数实际上是
Function
的实例,即普通函数继承于Function.prototype
。func.__proto__ === Function.prototype
。 Function.prototype
继承于Object.prototype
,并且没有prototype
这个属性。func.prototype
是普通对象,Function.prototype.prototype
是null
。- 所以,
Function.prototype
其实是个另类的函数,可以独立于/先于Function
产生。
Object
本身是个(构造)函数,是Function
的实例,即Object.__proto__
就是Function.prototype
。
The value of the [[Prototype]] internal property of the Object constructor is the standard built-in Function prototype object.
The value of the [[Prototype]] internal property of the Object prototype object is null, the value of the [[Class]] internal property is "Object", and the initial value of the [[Extensible]] internal property is true.
最后总结:先有Object.prototype
(原型链顶端),Function.prototype
继承Object.prototype
而产生,最后,Function
和Object
和其它构造函数继承Function.prototype
而产生。
评论