原型继承不直接实现观察者模式,但可为其提供轻量灵活的结构基础:通过basesubject/baseobserver原型共享通用逻辑,子类专注业务;需确保每个实例独立维护observers数组并正确绑定this。

原型继承本身不直接实现观察者模式,但它能为观察者模式提供轻量、灵活的结构基础——尤其在 JavaScript 中,常用来快速搭建可复用的被观察者(Subject)或观察者(Observer)骨架,避免重复写注册、通知、取消等逻辑。
用原型链共享通用观察者行为
把 addListener、notify、removeListener 这类公共方法放在父级原型上,子类实例通过原型链自动获得能力,无需每个类都重写。比如:
- 定义一个 BaseSubject 构造函数,其 prototype 上挂载
subscribe、unsubscribe、notify方法 - 具体业务类(如
WeatherStation或ChatRoom)通过Object.create(BaseSubject.prototype)继承,再补充自己的状态和触发逻辑 - 这样所有被观察者都有一致的接口,也便于统一管理生命周期或加日志、错误拦截等横切逻辑
观察者也可用原型简化实现
多个观察者类型(如 UI 更新器、日志记录器、缓存同步器)可能只在 update 行为上不同,其余(如持有 ID、绑定上下文、支持取消)可抽到基类原型中:
- 写一个 BaseObserver,封装
id生成、isActive状态、dispose()清理逻辑 - 子类只重写
onNotify(data),专注自身响应逻辑 - 避免每个观察者手动维护订阅关系或重复判断是否已销毁
注意:原型继承 ≠ 观察者模式本身
观察者模式的核心是“一对多依赖 + 状态变更通知”,原型只是组织代码的方式。关键点仍需手动落实:
- 被观察者内部必须维护一个观察者列表(数组或 Map),不能仅靠原型共享一个全局列表
- 每次实例化被观察者时,要初始化自己的 observers 数组,否则多个实例会互相干扰
- 原型上的方法操作的是
this.observers,所以 this 必须指向当前实例,不能丢失上下文(必要时 bind 或用箭头函数)
对比事件系统更直观
相比直接用 EventEmitter 或浏览器原生 CustomEvent,基于原型的手动实现更透明:
- 你能清楚看到谁注册了、何时通知、哪些观察者还活着
- 调试时容易打断点查
this.observers内容,而不是陷在事件派发的黑盒里 - 适合教学、小型工具库或需要精细控制通知时机/顺序的场景











