Function.prototype
根据ECMAScript语言规范:
15.3.3.1 Function.prototype
Function.prototype的初始值是函数原型对象(第15.3.4节)。
15.3.4 函数原型对象的属性
函数原型对象本身也是一个函数对象(它的[[Class]]为"Function"),当被调用时,接受任何参数并返回undefined。函数原型对象内部[[Prototype]]属性的值是对象原型对象(第15.3.2.1节)。
这是一个“空体”的函数;如果它被调用,则仅返回undefined。函数原型对象本身没有valueOf属性,但是它从对象原型对象继承了valueOf属性。
我得到了以下输出:
- Opera:function () { [native code] }
- Chrome:function Empty() {}
- IE7:function prototype() {[native code]}
- FF3:function () { }
Chrome和IE7命名了它们的函数,Opera和IE7告诉你它们不会透露实现细节。它们都同意以下内容:
nl(typeof Function.prototype)
与此进行比较:
nl(typeof Object.prototype)
nl(typeof Array.prototype)
nl(typeof String.prototype)
Function.prototype.prototype
在Opera和IE7中返回undefined,在Chrome中返回null,在FF3中返回[object Object]。由于“函数原型对象本身是一个函数对象”,它应该是对自身的循环引用,但为避免循环引用,它们选择了不同的方式。我不知道是否有标准或是由实现决定,不过我认为Object是正确的。顺便说一下,你可以看到内部[[prototype]]和公共prototype之间的区别,就像你在早些时候问的那样!
Function.prototype.prototype == Object.prototype
这是错误的,因为它们不是同一个对象,参见上面。
Function.prototype.prototype.prototype
只有FF会给你一个答案,因为它们的Function.prototype.prototype的实现返回一个Object。
他们在这个问题上是一致的:
nl(Object.prototype)
nl(Object.prototype.prototype)