JavaScript中用构造函数实现观察者模式的核心是职责分离与松耦合通信:Subject构造函数封装观察者集合及subscribe/notify/unsubscribe方法,Observer构造函数可选封装统一update接口,结合闭包保护私有状态,支持模块化实例与精准移除。

JavaScript 中用构造函数实现观察者模式,核心是把“被观察者”(Subject)和“观察者”(Observer)职责分离,通过构造函数封装状态、方法与关系管理,再结合发布-订阅逻辑达成松耦合通信。关键不是硬套设计模式术语,而是让对象能自主注册、通知、移除监听者。
用构造函数定义被观察者(Subject)
Subject 管理观察者列表,提供 subscribe、unsubscribe 和 notify 方法。用构造函数确保每个实例独立维护自己的观察者队列:
- 内部用数组或 Set 存储观察者(推荐 Set 避免重复添加)
-
subscribe接收一个回调函数,存入集合 -
notify遍历集合,逐个调用观察者函数,可传入事件数据 - 为避免内存泄漏,
unsubscribe应支持按引用移除(不能只靠索引)
用构造函数定义观察者(Observer)可选但推荐
虽然观察者常是普通函数,但用构造函数封装可增强复用性与上下文管理:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 例如 Observer 构造函数接收 id、处理逻辑、是否启用等配置
- 实例自带
update(data)方法,统一响应接口 - 便于在
unsubscribe时用instanceof或标识符精准移除 - 示例:
new Observer('ui-refresh', (data) => render(data))
组合使用:构造函数 + 闭包实现私有状态与解耦
不暴露内部观察者集合,靠闭包保护数据,同时允许外部扩展行为:
立即学习“Java免费学习笔记(深入)”;
- Subject 构造函数返回对象时,只暴露公开方法,隐藏
_observers - 可在 notify 前加钩子(如
beforeNotify),支持模板方法模式延伸 - 配合工厂函数或静态方法,快速创建带默认行为的 Subject 实例(如
EventBus.create()) - 避免全局污染:每个模块用独立 Subject 实例,而非单例
实际协作示例(无框架纯构造函数)
比如用户登录状态变更需通知多个组件:
function Subject() {
const observers = new Set();
return {
subscribe(fn) { observers.add(fn); },
unsubscribe(fn) { observers.delete(fn); },
notify(data) { observers.forEach(fn => fn(data)); }
};
}
function UserStore() {
const subject = Subject();
let user = null;
return {
login(userData) {
user = userData;
subject.notify({ type: 'login', user });
},
logout() {
user = null;
subject.notify({ type: 'logout' });
},
onChange(fn) { subject.subscribe(fn); },
offChange(fn) { subject.unsubscribe(fn); }
};
}
// 使用
const store = UserStore();
store.onChange(data => console.log('UI updated:', data));
store.login({ id: 1, name: 'Alice' });

















