Javascript知道何时修改对象值

时间:2019-03-28 01:21:59

标签: javascript proxy datatrigger

对于任何变量或其属性,是否有办法知道何时设置其值?

例如,说我有:

let x = { 'a': 1, 'b': 2 };
// x.a's set operation is linked to a method
x.a = 3; // the method is automatically called

当a的值更改时,有没有一种方法可以调用函数?许多代码将更改此值。我不想到处都添加方法调用。

我知道代理,但要使用它们似乎需要一个单独的变量。意思是,x不能作为自身的代理。

最好是这种技术适用于原始的和非原始的。

2 个答案:

答案 0 :(得分:3)

  

说实话,请使用Proxy

如果您真的不能使用Proxy,则可以使用setter和getters来实现。

尽管这确实意味着要重新声明原始x对象,但我认为它像您的问题中的“最小,完整且可验证的示例”一样被内联声明了

let x = {
  _a: 1,
  _b: 2,
  get a() {
    return this._a;
  },
  get b() {
    return this._b;
  },
  set a(value) {
    console.log(`changing a from ${this._a} to ${value}`);
    this._a = value;
  },
  set b(value) {
    console.log(`changing b from ${this._b} to ${value}`);
    this._b = value;
  }
};
x.a = 3;

答案 1 :(得分:3)

  

x不能作为自身的代理

可以。您只需更改

,即可将变量更改为指向代理
x = new Proxy(x, handler)

原始示例:

const handler = {
  set: function(obj, prop, value) {
    console.log('setting prop: ', prop, ' to ', value)
    obj[prop] = value;
    return true;
  }
};

let x = { 'a': 1, 'b': 2 };

x = new Proxy(x, handler);

x.a = 3; // the method is automatically called