新闻中心
J*aScript中的设计模式:单例、观察者模式等_js编程思想
单例模式确保类仅有一个实例并提供全局访问点,适用于配置管理、日志记录等场景,J*aScript中通过闭包和静态方法实现;观察者模式建立一对多依赖关系,状态变化时自动通知所有观察者,常用于事件系统和组件通信,通过Subject和Observer类实现松耦合。

在J*aScript开发中,设计模式是解决常见问题的可复用方案。它们帮助我们写出结构清晰、易于维护和扩展的代码。其中,单例模式和观察者模式是最常用且实用的两种设计模式。下面分别介绍它们的核心思想和实现方式。
单例模式:确保一个类只有一个实例
单例模式的核心是保证某个类在整个应用中只存在一个实例,并提供一个全局访问点。这在需要共享资源或控制对象创建频率时非常有用,比如配置管理、日志记录器或数据库连接池。
在J*aScript中,由于没有类的私有构造函数,我们通过闭包和静态属性模拟单例行为:
const Singleton = (function () {
let instance;
function createInstance() {
return { name: 'Singleton Instance' };
}
return {
getInstance: function () {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
// 使用
const obj1 = Singleton.getInstance();
const obj2 = Singleton.getInstance();
console.log(obj1 === obj2); // true
上面的代码利用立即执行函数(IIFE)创建了一个私有作用域,instance变量无法被外部直接访问,只能通过getInstance方法获取唯一实例。这种方式有效防止了重复创建对象。
观察者模式:实现对象间的松耦合通信
观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。这种模式常用于事件系统、数据绑定和状态管理等场景。
在该模式中,有两个核心角色:主题(Subject) 和 观察者(Observer)。主题负责维护观察者列表,并在状态变化时通知它们。
OneStory
OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。
319
查看详情
class Subject {
constructor() {
this.observers = [];
}
addObserver(observer) {
this.observers.push(observer);
}
removeObserver(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 observer1 = new Observer('Observer A');
const observer2 = new Observer('Observer B');
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.notify('State changed!');
// 输出:
// Observer A received: State changed!
// Observer B received: State changed!
这个实现让多个观察者可以动态订阅或取消订阅主题,实现了发布-订阅机制,降低了模块之间的耦合度。
实际应用场景建议
单例模式适合用于:
- 全局配置管理器
- 日志服务
- 缓存实例(如localStorage封装)
观察者模式适用于:
- 自定义事件系统
- 组件间通信(如Vue的$emit/$on)
- 状态管理雏形(类似Redux的监听机制)
合理使用这些模式能提升代码组织性,但也要避免过度设计。例如,简单的项目可能不需要手动实现完整的观察者模式,可以直接使用浏览器原生的EventTarget或现代框架提供的响应式系统。
基本上就这些。掌握这两种模式的本质,有助于理解更复杂的架构设计。以上就是J*aScript中的设计模式:单例、观察者模式等_js编程思想的详细内容,更多请关注其它相关文章!
# 也要
# 辽阳哪个网站推广好
# 成都消防网站建设
# 上海品牌网站建设公
# 钟楼区网站优化渠道
# seo收录情况
# 闵行抖音seo厂家
# 光山优化网络推广营销
# 数据推广怎么做好营销
# 最好的律师推广网站
# 大悟网站推广
# 相关文章
# 并在
# 两种
# 不需要
# vue
# 多个
# 记录器
# 配置管理
# 适用于
# 复用
# red
# javascript开发
# 作用域
# 常见问题
# 浏览器
# js
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】
Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑
Django模型中自动计算可用余额的实现方法
win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】
Win11怎么开启省电模式_Win11电池节电模式自动开启
c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析
铃兰之剑为这和平的世界希里技能组及加点推荐
如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
Animex动漫社网入口地址 Animex动漫社网正版在线入口
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
AI泡沫首次被“刺破”:GPU十年都无法存活!
解决Tabulator日期时间排序问题的专业指南
KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
PHP表单数据传递:如何通过隐藏输入字段获取动态ID
印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
使用Pandas转换并合并DataFrame:多列映射至统一结构
Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】
j*a toString()的覆盖
AO3中文官网链接_AO3网页版稳定镜像站
Python大型XML文件高效流式解析教程
Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
c++如何使用chrono库处理时间_c++标准库时间与日期操作
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
mysql备份恢复性能优化_mysql备份恢复性能优化方法
LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置
抖音网页版平台入口 抖音网页版官网在线访问教程
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明
绝地鸭卫平a核爆刀流玩法攻略
CSS图片焦点样式实现教程:理解与应用tabindex属性
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
痛风发作了怎么办? 快速止痛和后期饮食调理
Go语言中JSON数据解码与字段访问指南
Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation
怎么在mac上运行html代码_mac运行html代码方法【指南】
AO3镜像入口大全 AO3网页版内容访问全集
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
Win11网速慢怎么解决 Win11网络设置优化解除限速


2025-11-03
浏览次数:次
返回列表