对象继承自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具有其自己的caller
、length
等属性,因为Object.length
和Object.__proto__.length
甚至都不相同。如果Object确实从其[[prototype]]
即Function.prototype
中继承了length属性,它们应该相等,但事实并非如此。
问题是为什么MDN要提到Object只是从其[[prototype]]
对象继承了caller
、length
、arity
等属性?我认为这有点误导人。
Object.hasOwnProperty('caller')
会返回true
?我无法在Opera中重现。 - Bergi