Javascript Setter被禁止

时间:2014-06-04 10:24:06

标签: javascript setter getter

说我有这段代码:

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。我怎么能改变这个?

谢谢!

1 个答案:

答案 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