【问题标题】:Javascript Setter Being BypassedJavascript Setter 被绕过
【发布时间】:2014-06-04 10:24:05
【问题描述】:

假设我有这个代码:

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。我该如何更改?

谢谢!

【问题讨论】:

  • 第一个问题是setter不会被调用(你正在修改getter返回的对象的属性,而不是真正调用setter)。
  • +Qantas,我知道它没有被调用。我该如何解决这个问题?
  • 把delete放到getter中,然后当你接下来尝试查看x.units时,你会看到清空的版本。另一种方法是在x.units['foo'] = 1; 之后执行x.units = x.units
  • 将删除部分放在 getter 中不起作用。我倾向于做x.units['foo']++之类的事情
  • @user2195592 你必须把它放在之前 return

标签: javascript setter getter


【解决方案1】:

你是cannot intercept when a property is created,你需要一个Proxy。可惜只是和声草稿,目前只有supported in Firefox' Javascript 1.8.5

您的 setter 仅检测到 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多