สำหรับรหัสการผลิตที่ต้องการความเข้ากันได้กับเบราว์เซอร์ไคลเอนต์ฉันยังแนะนำคำตอบของ 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 ด้านล่าง
มีวิธีการทำหน้าที่เป็นต้นแบบที่ไม่นับที่นำไปสู่พวกเขามักจะเปิดขึ้นใน-Fi hasOwnProperty
ในลูปไม่มีที่ไม่ได้ใช้เป็น ฉันยังคิดว่าคำตอบนี้จะเหมาะถ้าการขยายต้นแบบของ Object ไม่ยุ่งเหยิง