新闻中心
J*aScript观察者模式_j*ascript事件系统
观察者模式是前端事件驱动编程的核心,它通过被观察者在状态变化时通知观察者实现松耦合通信;J*aScript的DOM事件、自定义事件及事件循环机制均基于此模式实现异步回调与跨组件通信。

观察者模式是前端开发中非常核心的设计模式之一,J*aScript 的事件系统正是基于这种模式实现的。它让对象之间可以松耦合地通信:一个对象(被观察者)在状态改变时通知所有依赖它的对象(观察者),而无需知道这些观察者是谁。
观察者模式的基本结构
观察者模式包含两个主要角色:
- 被观察者(Subject):维护一个观察者列表,提供添加、删除和通知观察者的方法。
- 观察者(Observer):实现一个更新方法,当被观察者触发通知时被调用。
下面是一个简单的手动实现:
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObse
rver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} received:`, data);
}
}
// 使用示例
const subject = new Subject();
const obs1 = new Observer('Observer 1');
const obs2 = new Observer('Observer 2');
subject.addObserver(obs1);
subject.addObserver(obs2);
subject.notify('Hello from subject!');
DOM 事件系统:浏览器中的观察者模式
浏览器的事件机制是观察者模式的典型应用。DOM 元素作为被观察者,事件监听函数就是观察者。
通过 addEventListener 添加监听,相当于注册观察者;事件触发时,浏览器自动调用回调函数,完成通知过程。
const button = document.getElementById('myButton');
button.addEventListener('click', function() {
console.log('Button was clicked!');
});
// 点击按钮后,回调函数被调用 —— 观察者收到通知
这种设计让 UI 行为与逻辑解耦,开发者无需轮询按钮状态,只需“订阅”感兴趣的事件即可。
自定义事件实现跨组件通信
除了 DOM 事件,J*aScript 还支持创建自定义事件,用于模块或组件间的通信。
Remover
几秒钟去除图中不需要的元素
304
查看详情
利用 EventTarget 或 CustomEvent 可以轻松构建发布-订阅系统。
// 创建一个可绑定事件的对象
const eventBus = new EventTarget();
// 监听自定义事件
eventBus.addEventListener('dataReady', (e) => {
console.log('Data received:', e.detail);
});
// 分发事件
const event = new CustomEvent('dataReady', { detail: 'Some data' });
eventBus.dispatch(event);
这种方式在复杂应用中常用于非父子组件通信,避免层层传递 props。
事件循环与异步通知
J*aScript 的事件系统还与事件循环紧密结合。用户交互、定时器、网络请求等都会生成事件,推入任务队列,由事件循环在适当时机执行回调。
例如:
setTimeout(() => {
console.log('Timeout callback executed');
}, 0);
console.log('Sync code runs first');
尽管延时为 0,回调仍会在当前执行栈清空后才被调用,体现了观察者模式在异步环境下的延迟通知特性。
基本上就这些。理解观察者模式有助于掌握事件驱动编程的本质,无论是处理用户交互、实现状态管理,还是构建响应式系统,都是基础能力。
以上就是J*aScript观察者模式_j*ascript事件系统的详细内容,更多请关注其它相关文章!
# 只需
# 河南关键词排名哪家靠谱
# 温州专业网站建设
# 鹤壁网站建设服务
# 支付系统平台网站建设
# 济宁网站建设
# 毒物营销推广措施分析
# 铝业网站seo优化服务
# WHAM五号网站建设
# 武汉网站推广竞价方案
# 登封手机网站建设
# 相关文章
# 感兴趣
# 会在
# javascript
# 不需要
# 是一个
# 都是
# 用户发送
# 自定义
# 回调
# ai
# 栈
# 前端开发
# 回调函数
# 浏览器
# 前端
# java
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
优化HTML表单样式:解决输入框焦点跳动与元素间距问题
红果短剧网页版官网入口 官方最新网址发布
德邦快递查询平台 德邦快递物流信息查询入口
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
Python自定义类排序:解决lambda键值访问TypeError的实践指南
Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
学习通在线学习平台 学习通网页版直接进入课程中心
html怎么运行外部js文件中的函数_运html外js文件函数法【技巧】
yandex入口引擎手机版 yandex安卓版下载入口
Node.js中HTML按钮与J*aScript函数交互的正确姿势
sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南
格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
在哪找SublimeJ远程工具_SFTP插件配置教程
荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】
高德地图怎么看全景照片_高德地图全景照片浏览教程
Pandas DataFrame 多条件优先级排序与排名
QQ官网正版登录链接 QQ在线登录入口最新
外媒分析《GTA6》定价:卖100美元可以但真没必要!
单12V-2×6实现为RTX 5090供电750W!甚至都没敢跑分
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端
天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
J*aScript打印功能_j*ascript输出控制
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
如何在网页中实现特定地点的随机图片展示
Win11网速慢怎么解决 Win11网络设置优化解除限速
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
Composer如何在生产环境安全地执行composer update
使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性
steam官方网页快速访问 steam账号注册全流程
飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】
必由学官网首页入口 必由学教师网页版登录指南
mysql密码锁定怎么解锁_mysql密码锁定解锁后修改密码步骤
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
PySpark中从现有列右侧提取可变长度字符创建新列的教程
qq游戏跨平台入口_qq游戏多设备同步登录
钉钉视频会议画面卡顿如何解决 钉钉会议画面优化方法
TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程
解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误
夸克AO3官网入口_AO3镜像网站2025推荐
在Socket.IO连接中实现Access Token自动更新与动态重连
Win11怎么修改默认浏览器_Windows 11设置Chrome为默认
必由学官网入口 必由学教师登录入口


2025-12-03
浏览次数:次
返回列表
rver(observer) {
this.observers = this.observers.filter(obs => obs !== observer);
}
notify(data) {
this.observers.forEach(observer => observer.update(data));
}
}
class Observer {
constructor(name) {
this.name = name;
}
update(data) {
console.log(`${this.name} received:`, data);
}
}
// 使用示例
const subject = new Subject();
const obs1 = new Observer('Observer 1');
const obs2 = new Observer('Observer 2');
subject.addObserver(obs1);
subject.addObserver(obs2);
subject.notify('Hello from subject!');