Đối với mã sản xuất yêu cầu khả năng tương thích lớn với các trình duyệt máy khách, tôi vẫn đề xuất câu trả lời của Ivan Nevostruev ở trên với shim để đảm bảo Object.keys
trong các trình duyệt cũ hơn. Tuy nhiên, có thể nhận được chức năng chính xác được yêu cầu bằng defineProperty
tính năng mới của ECMA .
Kể từ ECMAScript 5 - Object.defineProperty
Kể từ ECMA5, bạn có thể sử dụng Object.defineProperty()
để xác định các thuộc tính không thể đếm được. Khả năng tương thích hiện tại vẫn còn nhiều điều mong muốn, nhưng điều này cuối cùng sẽ trở nên có thể sử dụng được trong tất cả các trình duyệt. (Cụ thể lưu ý sự không tương thích hiện tại với 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"]
Tuy nhiên, vì ECMA5 đã được thêm, Object.keys
bạn cũng có thể sử dụng:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
Câu trả lời gốc
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
Chỉnh sửa: Vì câu trả lời này đã xuất hiện được một thời gian nên tôi sẽ không nói đến những điều trên. Bất cứ ai đọc điều này cũng nên đọc câu trả lời của Ivan Nevostruev dưới đây.
Không có cách nào để làm cho các hàm nguyên mẫu không thể đếm được, điều này dẫn đến chúng luôn luôn xuất hiện trong các vòng lặp for-in không sử dụng hasOwnProperty
. Tôi vẫn nghĩ câu trả lời này sẽ rất lý tưởng nếu việc mở rộng nguyên mẫu của Object không quá lộn xộn.