寻找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
相关产品推荐
相关产品推荐

