当前位置:  开发笔记 > 编程语言 > 正文

纠正Function的原型链

如何解决《纠正Function的原型链》经验,为你挑选了2个好方法。

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

function nl(x) { document.write(x + "
"); } 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

some.. 12

Function.prototype的

来自ECMAScript语言规范:

15.3.3.1 Function.prototype

Function.prototype的初始值是Function原型对象(第15.3.4节).

15.3.4函数原型对象的属性

Function原型对象本身就是一个Function对象(它的[[Class]]是"Function"),当被调用时,它接受任何参数并返回undefined.Function原型对象的内部[[Prototype]]属性的值是Object原型对象(第15.3.2.1节).

它是一个"空体"的功能; 如果它被调用,它只返回undefined.Function原型对象没有自己的valueOf属性; 但是,它从Object prototype Object继承valueOf属性.

我得到这个输出:

Opera: function(){[native code]}

Chrome:功能空(){}

IE7: function prototype(){[native code]}

FF3: function(){}

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中得到了未定义,Chrome中的null和FF3中的[object Object].谁是对的?由于"函数原型对象本身就是一个Function对象",它不应该是对它自身的循环引用吗?为了避免循环引用,他们选择了不同的方式.我不知道是否有标准,或者是否由实现决定,但我认为对象是正确的.顺便说一句,在这里你可以看到内部[[prototype]]和公共原型之间的区别,就像你在之前的问题中提到的那样!

Function.prototype.prototype == Object.prototype

这是错误的,因为它不是同一个对象.往上看.

Function.prototype.prototype.prototype

只有FF会给你一个答案,因为它们的Function.prototype.prototype实现返回一个Object.

我同意你提出的输出看起来更逻辑.

他们对此表示同意:

nl(Object.prototype); // [object Object]
nl(Object.prototype.prototype); // undefined


Christoph.. 9

你在这里所做的并不是真正走在原型链上 - 这个问题可能会帮助你理解实际发生的事情.我没有费心去查看ECMA规范,但这是我对这个问题的看法:

Function是函数对象的构造函数

Function.prototype是所有函数对象继承的原型 - 它可能包含所有Function实例共有的属性,如callapply ; 您检查的实现是一致的,因为它实现为一个函数对象本身(正如一些指出,ECMA规范要求这样)

Function.prototype.prototype确实没有多大意义,但是当Function.prototype被实现为一个函数对象(它可能被用作构造函数)时,它至少应该存在; 使用Function.prototype作为构造函数创建的对象将继承其属性 - 但由于没有理由做这样疯狂的事情,将其设置为null,undefined或空对象是合理的

Function.prototype.prototype.prototype在所有可能的情况下都是未定义的:正如我们之前所见,Function.prototype.prototype应该是没有属性的东西(null,undefined或空对象),并且definetely不是函数对象; 因此,它的原型属性应该是未定义的,甚至可能在尝试访问时抛出错误

希望这可以帮助 ;)



1> some..:

Function.prototype的

来自ECMAScript语言规范:

15.3.3.1 Function.prototype

Function.prototype的初始值是Function原型对象(第15.3.4节).

15.3.4函数原型对象的属性

Function原型对象本身就是一个Function对象(它的[[Class]]是"Function"),当被调用时,它接受任何参数并返回undefined.Function原型对象的内部[[Prototype]]属性的值是Object原型对象(第15.3.2.1节).

它是一个"空体"的功能; 如果它被调用,它只返回undefined.Function原型对象没有自己的valueOf属性; 但是,它从Object prototype Object继承valueOf属性.

我得到这个输出:

Opera: function(){[native code]}

Chrome:功能空(){}

IE7: function prototype(){[native code]}

FF3: function(){}

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中得到了未定义,Chrome中的null和FF3中的[object Object].谁是对的?由于"函数原型对象本身就是一个Function对象",它不应该是对它自身的循环引用吗?为了避免循环引用,他们选择了不同的方式.我不知道是否有标准,或者是否由实现决定,但我认为对象是正确的.顺便说一句,在这里你可以看到内部[[prototype]]和公共原型之间的区别,就像你在之前的问题中提到的那样!

Function.prototype.prototype == Object.prototype

这是错误的,因为它不是同一个对象.往上看.

Function.prototype.prototype.prototype

只有FF会给你一个答案,因为它们的Function.prototype.prototype实现返回一个Object.

我同意你提出的输出看起来更逻辑.

他们对此表示同意:

nl(Object.prototype); // [object Object]
nl(Object.prototype.prototype); // undefined



2> Christoph..:

你在这里所做的并不是真正走在原型链上 - 这个问题可能会帮助你理解实际发生的事情.我没有费心去查看ECMA规范,但这是我对这个问题的看法:

Function是函数对象的构造函数

Function.prototype是所有函数对象继承的原型 - 它可能包含所有Function实例共有的属性,如callapply ; 您检查的实现是一致的,因为它实现为一个函数对象本身(正如一些指出,ECMA规范要求这样)

Function.prototype.prototype确实没有多大意义,但是当Function.prototype被实现为一个函数对象(它可能被用作构造函数)时,它至少应该存在; 使用Function.prototype作为构造函数创建的对象将继承其属性 - 但由于没有理由做这样疯狂的事情,将其设置为null,undefined或空对象是合理的

Function.prototype.prototype.prototype在所有可能的情况下都是未定义的:正如我们之前所见,Function.prototype.prototype应该是没有属性的东西(null,undefined或空对象),并且definetely不是函数对象; 因此,它的原型属性应该是未定义的,甚至可能在尝试访问时抛出错误

希望这可以帮助 ;)

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有