Enumerabilitat i pertanyença de les propietats

This article needs an editorial review. How you can help.

Les propietats enumerables són aquelles que es poden iterar en un bucle for..in. La pertanyença de les propietats és determinada pel fet de si la propietat pertany directament a l'objecte en comptes de la seva cadena de prototipus. Les propietats d'un objecte també poden ser contades per a obtenir el nombre de propietats. Hi ha diverses formes de detectar, iterar/enumerar i obtindre les propietats d'un objecte. Es pot veure a la taula quines es poden emprar en cada cas. A continuació trobareu un bocí de codi d'exemple on es mostra com otenir les categories no trobades.

Enumerabilitat i pertanyença de propietats - mètodes de detecció,  obtenció i iteració
Funcionalitat Pertanyença a l'objecte Pertanyença a l'objecte o la seva cadena de prototipus Pertanyença només a la cadena de prototipus
Detecció
Enumerable No enumerable Enumerable i No enumerable
propertyIsEnumerable hasOwnProperty i no propertyIsEnumerable hasOwnProperty
No disponible sense escriure més codi No disponible sense escriure més codi
Obtenció
Enumerable No enumerable Enumerable i No enumerable
Object.keys getOwnPropertyNames filtrat per a incloure propietats si no se li passa propertyIsEnumerable getOwnPropertyNames
No disponible sense escriure més codi No disponible sense escriure més codi
Iteració
Enumerable No enumerable Enumerable i No enumerable
Iterar sobre Object.keys Iterar sobre getOwnPropertyNames filtrat per a incloure propietats si no se li passa propertyIsEnumerable Iterar sobre getOwnPropertyNames
Enumerable No enumerable Enumerable i No enumerable
for..in No disponible sense escriure més codi No disponible sense escriure més codi
No disponible sense escriure més codi

Obtindre propietats per enumerabilitat/pertanyença

Cal recalcar que aquest no és l'algorisme més eficient per a tots els casos, però és útil per a una demostració ràpida.

  • La detecció es pot aconseguir mitjançant SimplePropertyRetriever.theGetMethodYouWant(obj).indexOf(prop) > -1
  • La iteració es pot aconseguir mitjançant SimplePropertyRetriever.theGetMethodYouWant(obj).forEach(function (value, prop) {}); (o bé usant filter(), map(), etc.)
var SimplePropertyRetriever = {
    getOwnEnumerables: function (obj) {
        return this._getPropertyNames(obj, true, false, this._enumerable); 
         // O es podria utilitzar for..in filtrat amb hasOwnProperty o bé simplement això: return Object.keys(obj);
    },
    getOwnNonenumerables: function (obj) {
        return this._getPropertyNames(obj, true, false, this._notEnumerable);
    },
    getOwnEnumerablesAndNonenumerables: function (obj) {
        return this._getPropertyNames(obj, true, false, this._enumerableAndNotEnumerable); 
        // O bé simplement utilitzar: return Object.getOwnPropertyNames(obj);
    },
    getPrototypeEnumerables: function (obj) {
        return this._getPropertyNames(obj, false, true, this._enumerable);
    },
    getPrototypeNonenumerables: function (obj) {
        return this._getPropertyNames(obj, false, true, this._notEnumerable);
    },
    getPrototypeEnumerablesAndNonenumerables: function (obj) {
        return this._getPropertyNames(obj, false, true, this._enumerableAndNotEnumerable);
    },
    getOwnAndPrototypeEnumerables: function (obj) {
        return this._getPropertyNames(obj, true, true, this._enumerable); 
        // O bé es podria utilitzar un for..in sense filtrar
    },
    getOwnAndPrototypeNonenumerables: function (obj) {
        return this._getPropertyNames(obj, true, true, this._notEnumerable);
    },
    getOwnAndPrototypeEnumerablesAndNonenumerables: function (obj) {
        return this._getPropertyNames(obj, true, true, this._enumerableAndNotEnumerable);
    },
    // Private static property checker callbacks
    _enumerable : function (obj, prop) {
        return obj.propertyIsEnumerable(prop);
    },
    _notEnumerable : function (obj, prop) {
        return !obj.propertyIsEnumerable(prop);
    },
    _enumerableAndNotEnumerable : function (obj, prop) {
        return true;
    },
    // Inspirat per http://stackoverflow.com/a/8024294/271577
    _getPropertyNames : function getAllPropertyNames(obj, iterateSelfBool, iteratePrototypeBool, includePropCb) {
        var props = [];

        do {
            if (iterateSelfBool) {
                Object.getOwnPropertyNames(obj).forEach(function (prop) {
                    if (props.indexOf(prop) === -1 && includePropCb(obj, prop)) {
                        props.push(prop);
                    }
                });
            }
            if (!iteratePrototypeBool) {
                break;
            }
            iterateSelfBool = true;
        } while (obj = Object.getPrototypeOf(obj));

        return props;
    }
};

Taula de detecció

  in for..in hasOwnProperty propertyIsEnumerable in Object.keys in Object.getOwnPropertyNames
Enumerable true true true true true true
No enumerable true false true false false true
Enumerable heredat true true false false false false
No enumerable heredat true false false false false false

Vegeu també

Document Tags and Contributors

 Contributors to this page: enTropy
 Last updated by: enTropy,