Para el código de producción que requiere una gran compatibilidad con los navegadores de clientes, sigo sugiriendo la respuesta de Ivan Nevostruev anterior con una cuña para garantizar Object.keys
en los navegadores más antiguos. Sin embargo, es posible obtener la funcionalidad exacta solicitada utilizando la nueva defineProperty
función de ECMA .
A partir de ECMAScript 5 - Object.defineProperty
A partir de ECMA5 puede usar Object.defineProperty()
para definir propiedades no enumerables. La compatibilidad actual todavía tiene mucho que desear, pero eventualmente debería ser utilizable en todos los navegadores. (¡Tenga en cuenta específicamente la incompatibilidad actual con IE8!)
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
var keys = [];
for(var i in this) if (this.hasOwnProperty(i)) {
keys.push(i);
}
return keys;
},
enumerable: false
});
var o = {
'a': 1,
'b': 2
}
for (var k in o) {
console.log(k, o[k])
}
console.log(o.keys())
# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]
Sin embargo, dado que ECMA5 ya se agregó, Object.keys
también podría usar:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Respuesta original
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Editar: dado que esta respuesta ha estado presente por un tiempo, dejaré la anterior sin tocar. Cualquiera que lea esto también debería leer la respuesta de Ivan Nevostruev a continuación.
No hay forma de hacer que las funciones prototipo no sean enumerables, lo que hace que siempre aparezcan en bucles for-in que no se usan hasOwnProperty
. Todavía creo que esta respuesta sería ideal si extender el prototipo de Object no fuera tan complicado.