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

时间:2014-11-26 07:41:55

标签: javascript inheritance

Object继承自Function.prototype,而Function.prototype继承自Object.prototype。

这是因为在内部,Object实际上是一个函数

function Object(){[native code]}

这就是我们可以编写像

这样的代码的原因
var ob=new Object();

对象继承了像'来电者'等属性。 ,' arity'等来自Function.prototype

然而(这是令人困惑的)

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

不应该返回false,因为Object实际上继承了'来电者'来自Function.prototype的属性?

同样的方式

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]]继承了length属性,那就应该是平等的,即Function.prototype 但事实并非如此

这就是为什么MDN提到Object只从其caller对象继承lengtharity[[prototype]]等?它有点误导恕我直言

1 个答案:

答案 0 :(得分:4)

来自MDN

  

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

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

  

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