Für Produktionscode, der eine große Kompatibilität mit Client-Browsern erfordert, empfehle ich immer noch Antwort von Ivan Nevostruev mit Unterlegscheibe, um sicherzustellen Object.keys
in älteren Browsern. Es ist jedoch möglich, genau die gewünschte Funktionalität zu erhalten, indem man das neue ECMA defineProperty
Funktion.
Ab ECMAScript 5 - Object.defineProperty
Ab ECMA5 können Sie verwenden Object.defineProperty()
um nicht aufzählbare Eigenschaften zu definieren. Die aktuelle Kompatibilität lässt noch viel zu wünschen übrig, aber das sollte irgendwann in allen Browsern nutzbar sein. (Beachten Sie insbesondere die derzeitige Inkompatibilität mit 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"]
Da ECMA5 jedoch bereits eine Object.keys
können Sie ebenso gut verwenden:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Ursprüngliche Antwort
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Editar: Da es diese Antwort schon eine Weile gibt, lasse ich das oben Gesagte unangetastet. Jeder, der dies liest, sollte auch die Antwort von Ivan Nevostruev unten lesen.
Es gibt keine Möglichkeit, Prototyp-Funktionen nicht aufzählbar zu machen, was dazu führt, dass sie immer in for-in-Schleifen auftauchen, die keine hasOwnProperty
. Ich denke immer noch, dass diese Antwort ideal wäre, wenn die Erweiterung des Prototyps von Object nicht so chaotisch wäre.