Untuk kode produksi yang membutuhkan kompatibilitas besar dengan browser klien saya masih menyarankan jawaban Ivan Nevostruev di atas dengan shim untuk memastikan Object.keys
di browser yang lebih lama. Namun, dimungkinkan untuk mendapatkan fungsionalitas tepat yang diminta menggunakan ECMA yang barudefineProperty
fitur .
Pada ECMAScript 5 - Object.defineProperty
Pada ECMA5 Anda dapat menggunakan Object.defineProperty()
untuk mendefinisikan properti yang tidak dapat dihitung. The kompatibilitas saat masih banyak yang harus diinginkan, tapi ini akhirnya harus menjadi digunakan di semua browser. (Secara khusus catat ketidakcocokan saat ini dengan 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"]
Namun, karena ECMA5 sudah menambahkan Object.keys
Anda mungkin juga menggunakan:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Jawaban asli
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Edit: Karena jawaban ini sudah ada untuk sementara waktu, saya akan membiarkan jawaban di atas tidak tersentuh. Siapa pun yang membaca ini juga harus membaca jawaban Ivan Nevostruev di bawah ini.
Tidak ada cara untuk membuat fungsi prototipe non-enumerable yang mengarah pada mereka selalu muncul di loop for-in yang tidak digunakan hasOwnProperty
. Saya masih berpikir jawaban ini akan ideal jika memperluas prototipe Object tidak begitu berantakan.