クライアント ブラウザとの大きな互換性を必要とするプロダクション コードについては、Ivan Nevostruev のshim を使用した回答をObject.keys
古いブラウザで使用することをお勧めします。ただし、ECMA の新defineProperty
機能を使用して、要求された正確な機能を取得することは可能です。
ECMAScript 5 以降 - Object.defineProperty
ECMA5 以降、Object.defineProperty()
列挙不可能なプロパティを定義するために使用できます。現在の互換性にはまだ多くの要望がありますが、最終的にはすべてのブラウザーで使用できるようになるはずです。(具体的には、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"]
ただし、ECMA5 は既に追加されているため、Object.keys
以下を使用することもできます。
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
元の答え
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
編集:この回答はしばらくの間出回っていたので、上記はそのままにしておきます。これを読んでいる人は、以下の Ivan Nevostruev の回答も読む必要があります。
プロトタイプ関数を列挙不可にする方法はありません。これにより、 を使用しない for-in ループで常に現れることになりますhasOwnProperty
。Object のプロトタイプの拡張がそれほど面倒でなければ、この答えは理想的だと思います。