Javascript 知道对象值何时被修改
Javascript Know when object value is modified
对于任何变量或其中的 属性,有没有办法知道它的值何时设置?
例如,假设我有:
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 不能是它自己的代理。
此技术最好适用于原始和非原始。
To be honest, use Proxy if you can
如果你真的不会使用 Proxy,你可以使用 setter 和 getter 来实现
虽然它确实意味着重新声明您的原始 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;
x can't be a proxy of itself
当然可以。您可以通过简单地执行
来更改变量以指向代理
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
对于任何变量或其中的 属性,有没有办法知道它的值何时设置?
例如,假设我有:
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 不能是它自己的代理。
此技术最好适用于原始和非原始。
To be honest, use Proxy if you can
如果你真的不会使用 Proxy,你可以使用 setter 和 getter 来实现
虽然它确实意味着重新声明您的原始 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;
x can't be a proxy of itself
当然可以。您可以通过简单地执行
来更改变量以指向代理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