对于需要与客户端浏览器高度兼容的生产代码,我仍然建议使用shim的Ivan Nevostruev的答案,以确保在较旧的浏览器中。但是,可以使用 ECMA 的新功能获得请求的确切功能。Object.keys
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在下面的答案。
没有办法使原型函数不可枚举,这导致它们总是出现在不使用 .我仍然认为,如果扩展Object的原型不是那么混乱,这个答案将是理想的。hasOwnProperty