说我有这段代码:
function test() {
this._units = {};
}
test.prototype = {
get units() { return this._units; },
set units(val) {
this._units = val;
for (var unit in this._units) {
if (this._units[unit] === 0)
delete this._units[unit];
}
}
};
现在,我可以通过以下方式分配一个单位:
x = new test();
x.units['foo'] = 1;
这一切都有效。但是,当我这样做时,
x.units['foo'] = 0;
// x.units = { 'foo' : 0 }
它不会从单位中删除foo
。我怎么能改变这个?
谢谢!
答案 0 :(得分:1)
您cannot intercept when a property is created,您需要Proxy。不幸的是,它只是一个和谐的草案,目前只有supported in Firefox' Javascript 1.8.5。
您的二传手只会检测到x.units = {foo:1}
的分配,但不会检测x.units.foo
的分配。您可以为您知道的units
对象上的每个属性创建setter,但是您需要一个额外的方法来使它们首先被知道(假设您不仅要将对象分配给x.units
)
但是,你可能最好不要这样做。设置为0
时删除自身的属性非常违反直觉。想想
x.units.foo = -1; x.units.foo += 2;
您是否希望此操作与
相同 x.units.foo = -1; x.units.foo++; x.units.foo++;
?第二个会产生NaN
而不是1
。