Enumerabilidad y posesi贸n de propiedades

Las propiedades enumerables son aquellas propiedades cuyo indicador enumerable interno se establece en true, que es el valor predeterminado para las propiedades creadas mediante una asignaci贸n simple o mediante un iniciador de propiedad (propiedades definidas mediante Object.defineProperty y tal valor enumerable predeterminado a false). Se muestran numerosas propiedades en bucles

a menos que la clave de la propiedad sea Symbol. La posesi贸n de las propiedades est谩 determinada por si la propiedad pertenece directamente al objeto y no a su cadena prototipo. Las propiedades de un objeto tambi茅n se pueden recuperar en total. Hay varios medios incorporados para detectar, iterar/enumerar y recuperar propiedades de objetos, y el gr谩fico que se muestra a continuaci贸n est谩 disponible. A continuaci贸n, se muestra un c贸digo de muestra que demuestra c贸mo obtener las categor铆as faltantes.
Propiedad, enumerabilidad y posesi贸n 鈥 m茅todos integrados de detecci贸n, recuperaci贸n e iteraci贸n
Funcionalidad Propia del Objeto Propia del Objeto y su cadena prototipo Solo en cadena prototipo
Detecci贸n
Enumerable No enumerable Enumerable y no enumerable

propertyIsEnumerable

hasOwnProperty

hasOwnProperty 鈥 filtrado para excluir enumerables mediante propertyIsEnumerable

hasOwnProperty
Enumerable No enumerable Enumerable y no enumerable
No disponible sin c贸digo adicional No disponible sin c贸digo adicional in
No disponible sin c贸digo adicional
Recuperaci贸n
Enumerable No enumerable Enumerable y no enumerable

Object.keys

getOwnPropertyNames

getOwnPropertySymbols

getOwnPropertyNames, getOwnPropertySymbols 鈥 filtrado para excluir enumerables usando propertyIsEnumerable

getOwnPropertyNames

getOwnPropertySymbols

No disponible sin c贸digo adicional No disponible sin c贸digo adicional
Iterable
Enumerable No enumerable Enumerable y no enumerable

Object.keys

getOwnPropertyNames

getOwnPropertySymbols

getOwnPropertyNames, getOwnPropertySymbols 鈥 filtrado para excluir enumerables usando propertyIsEnumerable

getOwnPropertyNames

getOwnPropertySymbols

Enumerable No enumerable Enumerable y no enumerable

for..in

(no incluye s铆mbolos)

No disponible sin c贸digo adicional No disponible sin c贸digo adicional
No disponible sin c贸digo adicional

Obtenci贸n de propiedades por enumerabilidad/posesi贸n

Ten en cuenta que este no es el algoritmo m谩s eficiente para todos los casos, pero es 煤til para una demostraci贸n r谩pida.

  • La detecci贸n puede ocurrir por SimplePropertyRetriever.theGetMethodYouWant(obj).indexOf(prop) > -1
  • La iteraci贸n puede ocurrir por SimplePropertyRetriever.theGetMethodYouWant(obj).forEach(function (value, prop) {}); (o usa filter(), map(), etc.)
var SimplePropertyRetriever = {
    getOwnEnumerables: function(obj) {
        return this._getPropertyNames(obj, true, false, this._enumerable);
         // O podr铆as usar for..in filtrado con hasOwnProperty o simplemente esto: 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 simplemente usa: 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 podr铆as usar "for..in" sin filtrar
    },
    getOwnAndPrototypeNonenumerables: function(obj) {
        return this._getPropertyNames(obj, true, true, this._notEnumerable);
    },
    getOwnAndPrototypeEnumerablesAndNonenumerables: function(obj) {
        return this._getPropertyNames(obj, true, true, this._enumerableAndNotEnumerable);
    },
    // Retrollamada del supervisor de propiedad est谩tica privada
    _enumerable: function(obj, prop) {
        return obj.propertyIsEnumerable(prop);
    },
    _notEnumerable: function(obj, prop) {
        return !obj.propertyIsEnumerable(prop);
    },
    _enumerableAndNotEnumerable: function(obj, prop) {
        return true;
    },
    // Inspirado en 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;
    }
};

Tabla de detecci贸n

in for..in obj.hasOwnProperty obj.propertyIsEnumerable Object.keys Object.getOwnPropertyNames Object.getOwnPropertyDescriptors Reflect.ownKeys()
Enumerable true true true true true true true true
No enumerable true false true false false true true true
S铆mbolos clave true false true true false false true true
Enumerable heredado true true false false false false false false
Heredado no enumerable true false false false false false false false
S铆mbolos clave heredados true false false false false false false false

Ve tambi茅n