原型链本身不直接构成观察者模型,但通过将subscribe/notify等方法挂载到原型、每个实例独立初始化observers数组、基类封装id管理与生命周期,可提升性能与可维护性。

原型链本身不直接构成观察者模型,但它能显著提升模型的性能和可维护性——关键在于把通用逻辑抽到原型上,让每个实例只专注自身状态与行为,避免重复创建函数、减少内存占用、加快方法查找速度。
共享核心方法,避免重复函数实例
每次 new 一个被观察者,如果把 subscribe、notify、unsubscribe 写在构造函数里,就会为每个实例创建一份新函数,浪费内存。改用原型链,所有实例共用同一套方法:
- 定义
BaseSubject构造函数,仅初始化私有状态(如this.observers = []) - 把注册、通知、移除等逻辑统一挂载到
BaseSubject.prototype上 - 子类通过
Object.setPrototypeOf(instance, BaseSubject.prototype)或 ES6 class 继承复用
确保实例隔离,防止 observer 数组污染
原型上的方法操作的是 this.observers,所以必须保证每个实例都有独立的 observers 数组:
- 绝不能在原型上写
observers = []—— 那会变成所有实例共享同一个数组 - 必须在构造函数或
init()中执行this.observers = [] - 常见错误:用
BaseSubject.prototype.observers = []初始化,会导致多个实例互相覆盖订阅关系
观察者基类封装生命周期与上下文管理
多个观察者类型(UI 更新器、日志记录器、缓存同步器)往往只在响应逻辑上不同。可用 BaseObserver 统一处理:
- 生成唯一
id,便于精准取消订阅 - 内置
isActive标志,避免已销毁的观察者被误调用 - 提供
dispose()方法清理副作用(如清除定时器、解绑事件) - 子类只需实现
onNotify(data),专注业务更新逻辑
结合 Object.defineProperty 提升响应效率
在需要监听属性变化的场景(如 MVVM 框架),可将数据劫持与原型链协同使用:
- 在
BaseSubject原型中提供defineReactive(key, val)工具方法 - 该方法内部调用
Object.defineProperty,并在 setter 中触发this.notify() - 避免每个具体主题都重写数据绑定逻辑,同时保持响应式更新的确定性
不复杂但容易忽略:原型链是组织结构的手段,不是模式本身;真正决定性能的是实例数据是否隔离、方法是否复用、通知路径是否精简。











