クライアントブラウザーとの大きな互換性を必要とする製品コードについてObject.keys
は、古いブラウザーで確実にするために、上記のIvan Nevostruevの回答をシムで提案します。ただし、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の回答も読んでください。
プロトタイプ関数を非列挙型にする方法はありませんhasOwnProperty
。そのため、使用しないfor-inループで常にプロトタイプ関数が表示されます。Objectのプロトタイプを拡張するのがそれほど面倒でなかったら、この答えは理想的だと私はまだ思います。