JavaScript面向对象设计模式旨在解决模块职责不清、状态散乱、复用困难、逻辑耦合等问题;构造函数+原型链实现轻量可复用组件,模块模式通过闭包隔离私有状态,观察者模式解耦跨层级通信,策略模式分离行为变化与主流程。

JavaScript 中的面向对象设计模式不是为了“套用概念”,而是为了解决前端架构中真实存在的问题:模块职责不清、状态散乱、组件复用困难、逻辑耦合严重。真正有效的应用,是让模式服务于可维护性与协作效率,而不是堆砌术语。
构造函数 + 原型链:轻量级可复用组件的基础
它不追求“类”的语法糖,而是利用原型机制实现内存友好、可扩展的对象创建。比如一个表单验证器:
通过 构造函数封装初始化逻辑(如绑定字段、读取规则),再把校验、重置等通用方法挂载到 原型上,避免每次实例化都重复创建函数。多个表单实例共享同一套方法,又各自维护独立的状态(如错误信息、是否已提交)。
这种模式天然适合封装 DOM 操作密集、需多实例并存的 UI 控件(如日期选择器、下拉搜索框),也便于后续用 ES6 class 语法平滑升级。
立即学习“Java免费学习笔记(深入)”;
模块模式(闭包):隔离私有状态与暴露稳定接口
前端常需管理全局但受控的资源,比如请求队列、主题配置、权限上下文。直接暴露变量或 this 属性容易被误改,而模块模式用闭包形成天然作用域边界:
- 内部变量和函数完全私有,外部无法直接访问
- 只通过返回的对象暴露有限、明确的 API(如 init()、setTheme()、hasPermission())
- 支持单例,也支持工厂函数生成多个隔离实例(如不同命名空间的事件总线)
它比单纯用 const 声明对象更进一步——不只是“不可重赋值”,而是从源头杜绝属性篡改和意外依赖。
观察者模式:解耦跨层级状态通信
在非 React/Vue 等响应式框架的项目中(如原生 JS 构建的后台管理系统),页面常由多个松散耦合的模块组成(导航栏、数据表格、筛选面板)。硬编码调用或全局事件易导致难以追踪的副作用。
手动实现一个极简观察者(EventBus)即可:
- 每个模块只订阅自己关心的事件(如 'user:login'、'filter:change')
- 触发方无需知道谁在监听,只负责 emit
- 支持一次性监听、移除监听、命名空间前缀,控制传播范围
它不替代状态管理库,但在中等复杂度项目中,比层层透传回调或滥用 localStorage 更可控、更可测试。
策略模式:让行为变化与主流程分离
当业务中存在多种相似但细节不同的处理逻辑(如不同支付渠道的签名方式、多种导出格式的生成逻辑),若用 if-else 堆砌,主函数会越来越臃肿且难测试。
策略模式将每种算法封装成独立对象(或函数),统一实现相同接口(如 .execute(data))。主流程只需根据条件选择对应策略,不关心内部实现:
- 新增一种导出方式?只需加一个新策略对象,不改原有代码
- 策略可单独单元测试,主流程也可用 mock 策略做隔离测试
- 运行时动态切换(如 A/B 测试)变得自然
它让“什么变了”和“怎么变”清晰分离,在需求频繁调整的业务前端中特别实用。
不复杂但容易忽略:模式的价值不在结构本身,而在它帮你识别出哪些该封装、哪些该隔离、哪些该替换。写得越顺手的代码,越值得停下来问一句——这里有没有隐藏的耦合?










