Що стосується виробничого коду, який вимагає великої сумісності з клієнтськими браузерами, я все ж пропоную відповідь Івана Невоструєва вище з прошивкою, щоб переконатися Object.keys
в старих браузерах. Однак можливо отримати точний функціонал, який вимагається за допомогою нової defineProperty
функції ECMA .
Станом на 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;
}
Редагувати: Оскільки ця відповідь існує деякий час, я залишаю недоторканим вище. Кожен, хто читає це, також повинен прочитати відповідь Івана Невоструєва нижче.
Немає можливості зробити прототипні функції незліченними, що призводить до того, що вони завжди з'являються у циклі для введення, які не використовуються hasOwnProperty
. Я все ще думаю, що ця відповідь була б ідеальною, якби розширення прототипу Об’єкта було не таким безладним.