134 votes

Est-il possible d'obtenir le non-énumérable hérité de noms de propriété d'un objet?

En JavaScript, nous avons peu de moyens d'obtenir les propriétés d'un objet, en fonction de ce que nous voulons obtenir.

1) Object.keys(), ce qui renvoie tous propre, énumérable propriétés d'un objet, d'un ECMA5 méthode.

2) for...in boucle, qui renvoie tous les énumérable propriétés d'un objet, indépendamment de si elles sont propres propriétés, ou héritées de la chaîne de prototype.

3) Object.getOwnPropertyNames(obj) qui renvoie toutes les propriétés d'un objet énumérable ou pas.

Nous avons aussi des méthodes telles que l' hasOwnProperty(prop) nous permet de vérifier si une propriété est héritée ou appartient réellement à cet objet, et propertyIsEnumerable(prop) qui, comme son nom l'indique, nous permet de vérifier si une propriété est énumérable.

Avec toutes ces options, il n'y a aucun moyen d'obtenir un non-énumérable, non-propre propriété d'un objet, qui est ce que je veux faire. Est-il possible de faire cela? En d'autres termes, je peux en quelque sorte d'obtenir une liste de l'héritage non-énumérable propriétés?

Je vous remercie.

149voto

airportyh Points 7912

Depuis getOwnPropertyNames pouvez-vous obtenir non énumérable propriétés, vous pouvez l'utiliser et de le combiner avec la marche sur la chaîne de prototype.

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
}

Je l'ai testé que sur Safari 5.1 et a obtenu

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

Mise à jour: Refait un peu le code (ajouté des espaces et des accolades, et amélioré le nom de la fonction):

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

1voto

Milan Jaric Points 3039

Pour obtenir tous hérité des propriétés ou des méthodes pour certains cas vous pouvez utiliser quelque chose comme ceci

var BaseType = function () {
    this.baseAttribute = "base attribute";
    this.baseMethod = function() {
        return "base method";
    };
};

var SomeType = function() {
    BaseType();
    this.someAttribute = "some attribute";
    this.someMethod = function (){
        return "some method";
    };
};

SomeType.prototype = new BaseType();
SomeType.prototype.constructor = SomeType;

var instance = new SomeType();

Object.prototype.getInherited = function(){
    var props = []
    for (var name in this) {  
        if (!this.hasOwnProperty(name) && !(name == 'constructor' || name == 'getInherited')) {  
            props.push(name);
        }  
    }
    return props;
};

alert(instance.getInherited().join(","));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X