Pour le code de production nécessitant une grande compatibilité avec les navigateurs clients, je suggère toujours la réponse d'Ivan Nevostruev ci-dessus avec shim pour garantir Object.keys
dans les navigateurs plus anciens. Cependant, il est possible d'obtenir la fonctionnalité exacte demandée en utilisant la nouvelle defineProperty
fonctionnalité d' ECMA .
À partir d'ECMAScript 5 - Object.defineProperty
Depuis ECMA5, vous pouvez utiliser Object.defineProperty()
pour définir des propriétés non énumérables. La compatibilité actuelle a encore beaucoup à désirer, mais cela devrait éventuellement devenir utilisable dans tous les navigateurs. (Notez en particulier l'incompatibilité actuelle avec 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"]
Cependant, puisque ECMA5 a déjà été ajouté, Object.keys
vous pouvez également utiliser:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Réponse originale
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Edit: Puisque cette réponse existe depuis un certain temps, je laisserai ce qui précède intact. Quiconque lit ceci devrait également lire la réponse d'Ivan Nevostruev ci-dessous.
Il n'y a aucun moyen de rendre les fonctions de prototype non énumérables, ce qui les conduit toujours à apparaître dans des boucles d'entrée qui ne sont pas utilisées hasOwnProperty
. Je pense toujours que cette réponse serait idéale si l'extension du prototype d'Object n'était pas si compliquée.