在JavaScript中,我们有几种获取对象属性的方式,具体取决于我们想要获取的内容。
1)Object.keys(),它返回对象的所有自己的,可枚举的属性,即ECMA5方法。
Object.keys()
2)for...in循环,返回对象的所有可枚举属性,无论它们是自己的属性还是从原型链继承。
for...in
3)Object.getOwnPropertyNames(obj)返回对象本身的所有属性,无论是否可枚举。
Object.getOwnPropertyNames(obj)
我们还拥有诸如hasOwnProperty(prop)让我们检查属性是否继承或实际上属于该对象之类的方法,以及propertyIsEnumerable(prop)顾名思义,可以让我们检查属性是否可枚举的方法。
hasOwnProperty(prop)
propertyIsEnumerable(prop)
使用所有这些选项,就无法获得对象的 不可枚举,非自有 属性,这就是我想要做的。有什么办法吗?换句话说,我能以某种方式获得继承的不可枚举属性的列表吗?
谢谢。
由于getOwnPropertyNames可以获取不可枚举的属性,因此可以使用它,并将其与沿原型链向上移动结合起来。
getOwnPropertyNames
function getAllProperties(obj){ var allProps = [] , curr = obj do{ var props = Object.getOwnPropertyNames(curr) props.forEach(function(prop){ if (allProps.indexOf(prop) === -1) allProps.push(prop) }) }while(curr = Object.getPrototypeOf(curr)) return allProps }
我在Safari 5.1上测试过
> getAllProperties([1,2,3]) ["0", "1", "2", "length", "constructor", "push", "slice", "indexOf", "sort", "splice", "concat", "pop", "unshift", "shift", "join", "toString", "forEach", "reduceRight", "toLocaleString", "some", "map", "lastIndexOf", "reduce", "filter", "reverse", "every", "hasOwnProperty", "isPrototypeOf", "valueOf", "__defineGetter__", "__defineSetter__", "__lookupGetter__", "propertyIsEnumerable", "__lookupSetter__"]
更新: 稍微重构了代码(添加了空格和花括号,并改进了函数名称):
function getAllPropertyNames( obj ) { var props = []; do { Object.getOwnPropertyNames( obj ).forEach(function ( prop ) { if ( props.indexOf( prop ) === -1 ) { props.push( prop ); } }); } while ( obj = Object.getPrototypeOf( obj ) ); return props; }