javascript - Javascript 对象之间的通知

标签 javascript

如果我们有 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/

相关文章:

javascript - 显示 ajax 的响应不起作用

javascript - 给定一个包含数字的数组,当 2 个元素加起来等于一个目标时,我如何编写一个递归函数来查找数组中的索引?

javascript - <input type ="datetime-local"> 如何以15mns间隔显示分钟

javascript - $.inArray() 用于存储在数组中的元素

JavaScript 试图打印一个字母在字符串中出现的次数,但它打印了不止一次

javascript - vue-apollo 在路由器保护中执行 graphql 查询

javascript - 我的简单按钮有什么问题?

javascript - 在javascript中返回带参数的消息

javascript - 在 React 中使用类的目的是什么?

javascript - 如何让表单在提交之前等待 ajax 完成?