javascript – 更正Function的原型链

以下程序的正确输出(ECMA标准是否正确)是多少?

function nl(x) { document.write(x + "<br>"); }
nl(Function.prototype);
nl(Function.prototype.prototype);
nl(Function.prototype.prototype == Object.prototype);
nl(Function.prototype.prototype.prototype);

Chrome和IE6同意说:

function Empty() {}
null for Chrome / undefined for IE6
false

然后崩溃.

Mozilla输出:

function () { }
[object Object]
false
undefined

这些都是正确的吗?似乎Mozilla的确做得更好,但最好的输出是

function () { }
[object Object]
true
undefined
你在这里所做的并不是真正走在原型链上 – this question可能会帮助你理解实际发生的事情.我没有费心去查看ECMA规范,但这是我对此问题的看法:

> Function是函数对象的构造函数
> Function.prototype是所有函数对象继承的原型 – 它可能包含所有Function实例共有的属性,如call和apply;您检查的实现是一致的,因为它实现为一个函数对象本身(正如一些指出,ECMA规范要求这样)
> Function.prototype.prototype实际上没有多大意义,但是当Function.prototype被实现为一个函数对象(它可能被用作构造函数)时,它至少应该存在;使用Function.prototype作为构造函数创建的对象将继承其属性 – 但由于没有理由做这样疯狂的事情,将其设置为null,undefined或空对象是合理的
> Function.prototype.prototype.prototype在所有可能性中都是未定义的:正如我们之前所见,Function.prototype.prototype应该是没有属性的东西(null,undefined或空对象),并且definetely不是函数对象;因此,它的prototype属性应该是未定义的,甚至可能在尝试访问时抛出错误

希望这可以帮助 😉

翻译自:https://stackoverflow.com/questions/383172/correct-prototype-chain-for-function

转载注明原文:javascript – 更正Function的原型链