Function.prototype
来自ECMAScript Language
Specification:
15.3.3.1 Function.prototype
Function.prototype 的初始值为
函数原型对象(部分
15.3.4)。
15.3.4 函数原型对象的属性
函数
原型对象本身就是一个函数
对象(其 [[Class]] 是“功能”)
那,当被调用时,接受任何
参数并返回未定义。这
内部 [[Prototype]] 的值
函数原型的属性
object 是 Object 原型对象
(第 15.3.2.1 节)。
这是一个“空体”的函数;
如果它被调用,它只会返回
不明确的。函数原型
对象没有 valueOf
自己的财产;然而,它
继承 valueOf 属性
对象原型Object。
我得到这个输出:
-
Opera: function () { [原生代码] }
-
Chrome: 函数 Empty() {}
-
IE7: 函数原型() { [本机代码]}
-
FF3: 函数 () { }
Chrome 和 IE7 已经命名了它们的功能,Opera 和 IE7 告诉你它不会透露实现。他们都同意这一点:
nl(typeof Function.prototype); //function
比较一下:
nl(typeof Object.prototype); //object
nl(typeof Array.prototype); //object
nl(typeof String.prototype); // object
Function.prototype.prototype
我从 Opera 和 IE7 获得 undefined,从 Chrome 获得 null,从 FF3 获得 [object Object]。谁是对的?既然“函数原型对象本身就是一个函数对象”,它不应该是对自身的循环引用吗?为了避免循环引用,他们选择了不同的方式。我不知道是否有一个标准或者它是否取决于实现,但我认为 Object 是正确的。顺便说一句,在这里您可以看到内部 [[prototype]] 和公共原型之间的区别,就像您在之前的问题中所问的那样!
Function.prototype.prototype == Object.prototype
这是错误的,因为它不是同一个对象。见上文。
Function.prototype.prototype.prototype
只有 FF 会给你答案,因为他们的 Function.prototype.prototype 实现返回一个对象。
我同意您提出的输出看起来更合乎逻辑。
他们确实同意这一点:
nl(Object.prototype); // [object Object]
nl(Object.prototype.prototype); // undefined