W przypadku kodu produkcyjnego wymagającego dużej kompatybilności z przeglądarkami klienckimi nadal sugeruję powyższą odpowiedź Iwana Nevostrueva, aby upewnić się Object.keys
w starszych przeglądarkach. Możliwe jest jednak uzyskanie dokładnej żądanej funkcjonalności za pomocą nowej wersji ECMAdefineProperty
funkcji .
Od ECMAScript 5 - Object.defineProperty
Od ECMA5 można używać Object.defineProperty()
do definiowania właściwości niepoliczalnych . Prąd kompatybilność nadal ma wiele do życzenia, ale to powinno ostatecznie stać się użyteczna we wszystkich przeglądarkach. (Zwłaszcza zwróć uwagę na obecną niezgodność z 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"]
Ponieważ jednak dodano już ECMA5 Object.keys
, równie dobrze możesz użyć:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Oryginalna odpowiedź
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Edytować: Ponieważ ta odpowiedź już istnieje, pozostawię powyższe nietknięte. Każdy, kto to czyta, powinien również przeczytać poniżej odpowiedź Iwana Nevostrueva.
Nie ma sposobu, aby funkcje prototypowe były niepoliczalne, co powoduje, że zawsze pojawiają się w pętlach wejściowych, które nie są używane hasOwnProperty
. Nadal uważam, że ta odpowiedź byłaby idealna, gdyby rozbudowa prototypu Object nie była taka niechlujna.