Javascript :: 为什么Object.hasOwnProperty('caller')返回true?

5

对象继承自Function.prototype,而Function.prototype又继承自Object.prototype。

这是因为在内部,对象实际上是一个函数。

function Object(){[native code]}

这就是为什么我们可以编写像下面这样的代码:

var ob=new Object();

对象从Function.prototype继承属性,如'caller'、'arity'等。

然而(这就是令人困惑的地方)

alert(Object.hasOwnProperty('caller')); //returns TRUE ! surprising

既然 Object 实际上从 Function.prototype 继承了 'caller' 属性,那么它不应该返回 false 吗?

同样的方式

alert(Function.hasOwnProperty('caller')); 
/*returns True. expected 'false' as Function object has no property of its own and inherits everything from Function.prototype*/

alert(Number.hasOwnProperty('caller')); //again returns true, unexpectedly

那么,有人知道为什么会发生这种情况吗?

非常感谢。希望我听起来不太天真。

编辑

尝试使用Object.getOwnPropertyNames(Object)确实将'caller'作为Object本身的一个属性返回。

因此,Object.hasOwnProperty('caller')是事实上正确的。

但是,现在问题是为令MDN文档中,'caller'被提及为从Function继承而来的。

所以这肯定会引起困惑。

那么这是文档中的错误吗?谢谢。

编辑-2

我能得出结论,即Object具有其自己的callerlength等属性,因为Object.lengthObject.__proto__.length甚至都不相同。如果Object确实从其[[prototype]]Function.prototype中继承了length属性,它们应该相等,但事实并非如此。

问题是为什么MDN要提到Object只是从其[[prototype]]对象继承了callerlengtharity等属性?我认为这有点误导人。


在哪个浏览器/JS引擎中,Object.hasOwnProperty('caller')会返回true?我无法在Opera中重现。 - Bergi
@Bergi 在当前的 Firefox 中,例如 - dsuckau
1个回答

4

来自MDN

使用函数声明创建的函数是Function对象,并具有Function对象的所有属性、方法和行为。

在严格模式下,每个函数都有自己的callerarguments属性。请参阅ES5规范的15.3.513.2节。

与严格模式函数(13.2)对应的函数实例以及使用Function.prototype.bind方法创建的函数实例(15.3.4.5)具有名为“caller”和“arguments”的属性,它们会抛出TypeError异常。


哦,Object 可能不是使用函数声明创建的函数? - Bergi
但我没有使用严格模式,因为我没有使用use strict; 其次,即使它是一个函数对象又怎样? 重点是,即使Function对象本身没有任何自有属性。所有属性都从Function.prototype继承。 所以,即使Object是一个函数,它仍然不应该显示Object.hasOwnProperty('caller');为true。 - Sarabjeet
1
@Sarabjeet 你无法控制Object的创建。显然它们是在严格模式下创建的。请阅读 13.2步骤19callerarguments属性将在创建时添加,而不是继承。 - dusky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接