javascript单例模式核心是主动控制返回同一对象引用,常用闭包缓存+懒加载实现;es模块导出天然单例;构造函数软拦截不可靠,应统一访问入口并避免全局污染。

JavaScript 中单例模式函数确保只实例化一次,核心不是“禁止 new”,而是**主动控制返回值始终指向同一个对象引用**。只要每次调用都返回已创建的实例,而不是新建,就达成了单例效果。
靠缓存判断 + 懒加载初始化
最常用也最可靠的方式:函数内部维护一个私有变量(如 instance),首次调用时创建并保存,后续直接返回它。
- 用闭包或静态属性(static instance)保存实例,避免外部篡改
- 不依赖构造函数是否被 new,而是把“创建逻辑”收束到一个入口(比如 getInstance())
- 首次调用才执行 new 或对象构造,之后跳过创建步骤
用模块导出天然实现单例
ES 模块在运行时只执行一次,导出的对象天然唯一:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 写一个模块文件(如 logger.js),直接导出一个对象或类实例
- 所有 import 它的地方拿到的都是同一份引用
- 无需手动判断、缓存或 getInstance,简洁且不易出错
构造函数里做“软拦截”不推荐但常见
有些写法在 constructor 中检查是否已有实例,并返回已有引用:
- 例如:if (Singleton.instance) return Singleton.instance;
- 这种写法无法真正阻止 new,仅靠约定;多次 new 仍会执行构造逻辑(可能造成副作用)
- 更适合快速原型,不适合对可靠性要求高的场景
关键细节不能漏
真正起作用的不是语法糖,而是这几个点:
- 实例必须被持久持有——放在闭包、静态属性或模块顶层变量中
- 所有访问路径必须经过同一出口——比如统一走 getInstance(),不混用 new 和导出对象
- 避免全局污染——不用 window.xxx 存实例,优先用模块封装或 class static
- 注意内存泄漏风险——长期持有的单例如果引用了大量临时数据,需提供 clear() 或 destroy() 方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










