Für Produktionscode, der eine große Kompatibilität mit Client-Browsern erfordert, empfehle ich weiterhin Ivan Nevostruevs Antwort oben mit Shim, um dies Object.keys
in älteren Browsern sicherzustellen . Mit der neuen Funktion von ECMA ist es jedoch möglich, die genaue angeforderte Funktionalität zu erhalten defineProperty
.
Ab ECMAScript 5 - Object.defineProperty
Ab ECMA5 können Sie Object.defineProperty()
nicht aufzählbare Eigenschaften definieren. Die aktuelle Kompatibilität lässt noch zu wünschen übrig, sollte aber irgendwann in allen Browsern verwendbar sein. (Beachten Sie insbesondere die aktuelle 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 hinzugefügt wurde, können Object.keys
Sie auch Folgendes 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;
}
Bearbeiten: Da es diese Antwort schon eine Weile gibt, werde ich das oben Gesagte unberührt lassen. Wer dies liest, sollte auch die Antwort von Ivan Nevostruev unten lesen.
Es gibt keine Möglichkeit, Prototypfunktionen nicht aufzählbar zu machen, was dazu führt, dass sie immer in For-In-Schleifen auftauchen, die nicht verwendet werden hasOwnProperty
. Ich denke immer noch, dass diese Antwort ideal wäre, wenn die Erweiterung des Prototyps von Object nicht so chaotisch wäre.