我有一堂课,看起来像这样
export default class {
constructor () {
this.store = {}
}
setX (x, y) {
this.store[x] = y
}
}
我如何在this.store上定义一个getter来获取一个未定义的值时返回0?
让我举个例子吧:
setX(‘a’,1)会将this.store [‘a’]设置为1
那么this.store [‘a’]将按预期返回1.
但是this.store [‘b’]将返回未定义,但我希望getter改为返回0(并且可能不确定setX(‘b’,0)).
我知道我可以使用Object.defineProperty定义一个自定义getter,但我只是无法解决如何访问存储对象的任意(尚未定义)属性的问题.
这是完全可能的,还是我必须使用这种解决方法?
getX (x) {
return this.store[x] || 0
}
我想避免这种情况,因为this.store [x]看起来更干净.
解决方法:
How would I define a getter on
this.store
to return0
when getting anundefined
value?
除非您能预料到要支持的所有可能的属性名称并为其定义吸气剂,否则您需要一个Proxy和get
trap,这是ES2015以来的新增功能(并且不能进行多填充).代理在性能方面很昂贵,仅在真正需要它们时才使用它们.
例:
class Example {
constructor () {
this.store = new Proxy({}, {
get(target, property) {
return property in target ? target[property] : 0;
}
});
}
setX (x, y) {
this.store[x] = y;
}
}
const e = new Example();
console.log("Setting a");
e.setX("a", "foo");
console.log("a = " + e.store.a);
console.log("b = " + e.store.b);
当然,如果您将商店设为私有,则只能通过对象上的getX方法强制执行访问,这将避免使用代理,而以在每个实例的基础上定义setX和getX为代价(目前为private data is coming) :
class Example {
constructor () {
const store = {};
this.setX = (x, y) => {
store[x] = y;
};
this.getX = x => {
return x in store ? store[x] : 0;
};
}
}
const e = new Example();
console.log("Setting a");
e.setX("a", "foo");
console.log("a = " + e.getX("a"));
console.log("b = " + e.getX("b"));