我希望能够直接在对象上调用keys()
,values()
和items()
,作为Object.keys|values|entries(...)
的一种简写形式。以下是目前为止的内容:
let o = {
a: 1,
b: 2,
keys() {return Object.keys(this)},
values() {return Object.values(this)},
items() {return Object.entries(this)}
};
for (let k of o.keys()) console.log(k);
for (let v of o.values()) console.log(v);
for (let [k,v] of o.items()) console.log(k,v);
似乎得到了我想要的,除了我不希望这个属性是可枚举的。与此相关的两件事:
-
使项目不可枚举(因此只有
a
和b
显示为键)的正确方法是什么?以下内容足够好吗?for (let prop of ['keys', 'values', 'items']) Object.defineProperty(o, prop, {enumerable: false}) // or ['keys','values','items'].forEach((prop,idx) => Object.defineProperty(o, prop, {enumerable: false}));
-
以上(我认为是一个方便的方法)会被认为是一个坏主意,如果是,为什么?
您可以向对象添加辅助方法。原型对象(基本上是所有javascript对象的父对象),以便所有对象都有.keys()
,.values()
和.entries()
方法。
const obj = {
a: 1,
b: 2
};
for (let prop of ['keys', 'values', 'entries']) {
Object.defineProperty(Object.prototype, prop, {
enumerable: false,
value: function() {
return Object[prop](this);
}
});
}
console.log(obj);
console.log(obj.keys());
console.log(obj.values());
console.log(obj.entries());
您可以编辑原型方法,这样更改将是全局的。
Object.prototype.keys = function(){
return Object.keys(this);
}
Object.prototype.entries = function(){
return Object.entries(this);
}
Object.prototype.values = function(){
return Object.values(this);
}
const test = {
name: "bob"
};
console.log({
keys: test.keys(),
values: test.values(),
entries: test.entries(),
});