Is it possible to get the non-enumerable inherited property names of an object?

后端 未结 9 1774
温柔的废话
温柔的废话 2020-11-22 12:46

In JavaScript we have a few ways of getting the properties of an object, depending on what we want to get.

1) Object.keys(), which returns all own, enu

9条回答
  •  忘了有多久
    2020-11-22 13:41

    Since getOwnPropertyNames can get you non-enumerable properties, you can use that and combine it with walking up the prototype chain.

    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
    }
    

    I tested that on Safari 5.1 and got

    > 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__"]
    

    Update: Refactored the code a bit (added spaces, and curly braces, and improved the function name):

    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;
    }
    

提交回复
热议问题