JavaScript观察者模式实现原理与代码解析
本文详细解析JavaScript中的观察者设计模式,通过定义Subject(被观察者)和Observer(观察者)两个核心类,实现对象属性变化的监听机制。文章包含完整的构造函数、状态管理、观察者队列增删及事件触发方法的代码示例,并探讨了该模式在降低代码耦合度与提升可扩展性方面的优势,同时指出了观察者过多可能带来的性能开销问题。
观察者设计模式
在观察者模式中,系统主要包含被观察者(Subject)和观察者(Observer)两类角色。当被观察者的状态达到特定边界条件时,会主动触发事件通知所有注册的观察者。实现这一模式通常需要定义两个构造函数,分别用于实例化被观察者和观察者。
利用观察者模式可以监听对象特定属性的修改行为。一旦目标对象的属性值发生变化,即可自动触发观察者中预定义的相关方法。
初始数据
let obj = {
name: "若水"
}
被观察者
创建被观察者类时,需定义一个初始化状态以记录被观察属性的初始值。同时,需要维护一个观察者方法队列,该队列负责执行对观察者的添加、删除操作,并在状态变更时触发所有注册观察者的回调方法。被观察者类还需提供三个核心方法:修改属性值的方法(用于更新状态并触发通知)、添加观察者的方法以及删除观察者的方法。
// 被观察者类
class Subject {
//未传值初始为空
constructor(state = "") {
// 初始状态
this.state = state
// 观察者方法队列
this.observsers = []
}
// 设置自己的状态
setState(val) {
// 告诉观察者目前改变成了什么状态
this.state = val;
// 同时需要把自己身上的观察者方法全部触发
this.observsers.map(item => {
// item是每一个观察者,每一个观察者是一个对象
item.callback(this.state);
})
}
// 添加观察者
addObserver(observer) {
// 把观察者传递进来
this.observsers.push(observer)
}
// 删除观察者
removeObserver(observer) {
// 过滤出来非当前观察者的观察者
this.observsers = this.observsers.filter(obs => obs !== observer);
}
}
观察者
创建观察者类用于标识观察者身份并定义其执行逻辑。观察者通常包含两个关键属性:一个是表示其身份的名称或标识,另一个是具体的回调方法。当被观察者触发事件时,将调用此回调方法以执行相应的业务逻辑。
// 观察者类
class Observer {
// name需要观察的参数
// callback 观察的参数达到边界条件触发的事件
constructor(name, callback = () => { }) {
this.name = name;
this.callback = callback;
}
}
最后我们来使用一下:
// 创建观察者
const ObserverName = new Observer('监听obj改变', () => { console.log('obj发生改变'); })
// 创建一个被观察者
const name = new Subject(obj.name)
// 添加一个观察者
name.addObserver(ObserverName)
//触发观察者方法
name.setState('前端若水')
观察者设计模式适用于监听一对多的操作场景,例如监听对象属性的修改。该模式能够有效降低代码间的耦合度并提升系统的可扩展性。然而,如果被观察者注册了过多的观察者,会导致运行时间增加以及程序复杂度的提升。
到此这篇关于JavaScript设计模式中的观察者模式的文章就介绍到这了,更多相关JavaScript 观察者模式内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
JS大数值转字符串出现科学计数法怎么办
2026-11-05 17:09:21
JS split切割后出现空字符串怎么过滤
2026-11-05 16:00:30
在 React 或 Vue 项目中封装使用 JS 节流防抖
2026-11-05 15:27:29
JavaScript中怎么将带小数的字符串转为整数?
2026-11-05 14:32:38
怎么用JavaScript策略模式重构电商促销计算逻辑?
2026-11-05 14:01:09
