You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻找Swift/Foundation NotificationCenter的原生JavaScript等价实现

Swift NotificationCenter 的原生 JavaScript 等价实现

原生JavaScript里,我们可以通过**CustomEvent + 事件监听机制**实现和Swift NotificationCenter完全一致的发布订阅能力,支持通知订阅、发布,以及携带自定义数据。

1. 订阅通知(对应 Swift 的 addObserver)

和Swift中注册观察者类似,我们可以通过addEventListener订阅指定名称的通知,回调函数会在通知发布时触发:

基础全局订阅

// 订阅名为"foo"的通知
window.addEventListener('foo', (event) => {
  // event.detail 对应 Swift 中的 userInfo,存储自定义数据
  console.log('收到foo通知,携带数据:', event.detail);
});

类中的订阅(类似Swift中绑定实例方法)

如果需要在类内部绑定实例方法作为回调,记得处理this指向,同时在实例销毁时移除监听避免内存泄漏:

class MyClass {
  constructor() {
    // 绑定this,确保回调中this指向当前类实例
    this.handleFooNotification = this.handleFooNotification.bind(this);
    // 订阅通知
    window.addEventListener('foo', this.handleFooNotification);
  }

  handleFooNotification(event) {
    console.log('类实例收到foo通知,数据:', event.detail);
    // 执行类的业务逻辑
  }

  // 销毁实例时移除监听
  destroy() {
    window.removeEventListener('foo', this.handleFooNotification);
  }
}

2. 发布通知(对应 Swift 的 post)

使用CustomEvent创建带自定义数据的通知,再通过dispatchEvent发布:

// 创建自定义通知,detail字段存放自定义数据(对应userInfo)
const fooNotification = new CustomEvent('foo', {
  detail: { bar: 42 }
});

// 发布通知
window.dispatchEvent(fooNotification);

进阶:自定义独立事件中心

如果不想使用全局window,可以创建独立的EventTarget实例,完全模拟NotificationCenter.default的单例事件中心:

// 自定义全局事件中心
const NotificationCenter = new EventTarget();

// 订阅通知
NotificationCenter.addEventListener('foo', (event) => {
  console.log('收到通知:', event.detail);
});

// 发布通知
NotificationCenter.dispatchEvent(new CustomEvent('foo', { detail: { bar: 42 } }));

内容的提问来源于stack exchange,提问作者user3151675

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:31:23