gpt4 book ai didi

javascript - Javascript 对象之间的通知

转载 作者:行者123 更新时间:2023-12-03 01:29:53 24 4
gpt4 key购买 nike

如果我们有 2 个 Javascript 对象,我们如何让它们进行通信。例如如果 1 个对象中的值发生变化,如何通知另一个对象)

最佳答案

一种方法是向可观察对象添加方法,并通过此方法设置所需属性的值(如果愿意,可以使用 setter 方法)。这个 setter 方法将接受一个值和一个回调,每次调用 setter 时都会执行该回调。

该回调函数将获取观察者列表,并可能执行一些与它们相关的代码。

const observable = {
prop: 1,
setProp(val, cb) {
console.log(`value of "prop" has been set to ${val}`);
this.value = val;
cb();
}
};

const observer1 = {
name: 'observer1',
notifyMe() {
console.log(`${this.name} has been notified`);
}
};

const observer2 = {
name: 'observer2',
notifyMe() {
console.log(`${this.name} has been notified`);
}
};

// callback for setter method
function notifyObservers(...observers) {
observers.forEach((obs) => {
obs.notifyMe();
});
}

// set value of observable and pass callback which will then
// be executed
observable.setProp(2, () => {
notifyObservers(observer1, observer2);
});

使用代理和反射可以实现同样的效果。

const observable = {
prop: 1
};

const observer = {
name: 'observer',
notifyMe() {
console.log(`${this.name} has been notified`);
}
};

const proxy = new Proxy(observable, {
set(target, prop, val) {
console.log(`value of "${prop}" has been set to ${val}`);
observer.notifyMe();
return Reflect.set(target, prop, val);
}
});

proxy.prop = 2;

第一个示例和这个示例之间的区别在于,这里我们每次设置被观察对象的某些属性时都会调用 notifyMe,而在前面的示例中,我们仅在 prop 正在设置。

使用代理时,可以通过在 if 语句中包装 observer.notifyMe 部分来检查特定属性名称来实现相同的目的,例如 if (prop === 'prop' ) {observer.notifyMe() }.

关于javascript - Javascript 对象之间的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51351171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com