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ó |
|
No disponible sense escriure més codi |
No disponible sense escriure més codi |
Obtenció |
|
No disponible sense escriure més codi |
No disponible sense escriure més codi |
Iteració |
|
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 https://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é