小编典典

是否可以获得对象的不可枚举的继承属性名称?

javascript

在JavaScript中,我们有几种获取对象属性的方式,具体取决于我们想要获取的内容。

1)Object.keys(),它返回对象的所有自己的,可枚举的属性,即ECMA5方法。

2)for...in循环,返回对象的所有可枚举属性,无论它们是自己的属性还是从原型链继承。

3)Object.getOwnPropertyNames(obj)返回对象本身的所有属性,无论是否可枚举。

我们还拥有诸如hasOwnProperty(prop)让我们检查属性是否继承或实际上属于该对象之类的方法,以及propertyIsEnumerable(prop)顾名思义,可以让我们检查属性是否可枚举的方法。

使用所有这些选项,就无法获得对象的 不可枚举,非自有 属性,这就是我想要做的。有什么办法吗?换句话说,我能以某种方式获得继承的不可枚举属性的列表吗?

谢谢。


阅读 345

收藏
2020-04-25

共1个答案

小编典典

由于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;
}
2020-04-25