Per il codice di produzione che richiede una grande compatibilità con i browser client suggerisco ancora la risposta di Ivan Nevostruev sopra con lo shim per garantire Object.keys
nei browser più vecchi. Tuttavia, è possibile ottenere l'esatta funzionalità richiesta utilizzando la nuova defineProperty
funzionalità ECMA .
A partire da ECMAScript 5 - Object.defineProperty
A partire da ECMA5 è possibile utilizzare Object.defineProperty()
per definire proprietà non enumerabili. L' attuale compatibilità ha ancora molto da desiderare, ma alla fine dovrebbe diventare utilizzabile in tutti i browser. (Nota in particolare l'attuale incompatibilità 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"]
Tuttavia, poiché ECMA5 ha già aggiunto, Object.keys
è possibile utilizzare anche:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Risposta originale
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Modifica: Dal momento che questa risposta è in circolazione da un po ', lascerò intatto quanto sopra. Chiunque legga questo dovrebbe anche leggere la risposta di Ivan Nevostruev di seguito.
Non c'è modo di rendere non enumerabili le funzioni del prototipo, il che porta a farle apparire in loop for-in che non usano hasOwnProperty
. Penso ancora che questa risposta sarebbe l'ideale se l'estensione del prototipo di Object non fosse così disordinata.