Для производственного кода, требующего большой совместимости с клиентскими браузерами, я все же предлагаю ответ Ивана Невоструева, приведенный выше, с шимом, чтобы убедиться 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;
}
Изменить: так как этот ответ был вокруг некоторое время, я оставлю вышеизложенное нетронутым. Любой, кто читает это, должен также прочитать ответ Ивана Невоструева ниже.
Нет никакого способа сделать функции-прототипы не перечисляемыми, что приводит к их постоянному включению в циклы for-in, которые не используются hasOwnProperty
. Я все еще думаю, что этот ответ был бы идеальным, если бы расширение прототипа Object не было таким грязным.