2013-10-06 82 views
5

我喜欢Object.getOwnPropertyNames方法。它看起来像是一个用于从JS shell中学习对象的有用工具。 (注意:在我的测试中,我运行的是ECMA 5实现 - 谷歌浏览器版本28.0.1500.95)。但是,我发现getOwnPropertyNames似乎缺少一些东西。Javascript的“Object.getOwnPropertyNames”缺少属性?

下面是一个例子:

> var x= [] 
undefined 
> x.constructor 
function Array() { [native code] } 
> Object.getOwnPropertyNames(x) 
["length"] 

然而显然,x具有很多特性! (例如https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/prototype

> x.push 
function push() { [native code] } 
> x.pop 
function pop() { [native code] } 

任何人都可以帮助解释这是怎么回事呢?谢谢! :D

编辑:好吧!我看到getOwnPropertyNames只获取手头对象的属性名称。有没有简单的方法来获得继承属性?或者唯一的方法是遍历object.constructor.prototype .__ proto__?

+0

getOWNpropertyNames –

+0

的编辑的问题成为可能重复的[如何列出JavaScript对象的性质](http://stackoverflow.com/questions/208016/how-to-list -the-属性对的一的JavaScript对象) – Djizeus

回答

4

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

__proto__财产已被弃用,不应该使用。应该使用Object.getPrototypeOf而不是__proto__获取器来确定对象的[[Prototype]]。

> x = []; 
[] 
> Object.getOwnPropertyNames(Object.getPrototypeOf(x)); 
["length", "constructor", "toString", "toLocaleString", "join", "pop", "push", "concat", 
"reverse", "shift", "unshift", "slice", "splice", "sort", "filter", "forEach", "some", 
"every", "map", "indexOf", "lastIndexOf", "reduce", "reduceRight"] 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf