JavaScript中最推荐的单例实现是模块级单例,利用ES6模块默认导出的天然单例特性,简洁、可靠且符合语言习惯;其次为ES6 Class配合静态工厂方法,避免直接new;闭包方式适用于ES5环境。

JavaScript 中常用的设计模式有单例、工厂、观察者(发布-订阅)、策略、代理、装饰器、适配器、命令、状态、迭代器等。其中单例模式最常用于管理全局唯一实例,比如配置中心、日志对象、弹窗管理器、状态存储等。
单例模式的核心要点
单例确保一个类只有一个实例,并提供一个全局访问点。关键在于:控制实例创建时机 + 防止重复构造 + 统一返回已有实例。
不能直接用 new 多次生成新对象 首次调用时创建实例,后续调用都返回同一个引用 通常封装在闭包或模块作用域中,避免污染全局
基础版单例实现(ES5风格)
用闭包保存私有实例变量,通过静态方法暴露统一入口:
var Singleton = (function() { var instance = null; function createInstance() { return { data: 'I am the only one' }; } return { getInstance: function() { if (!instance) { instance = createInstance(); } return instance; } };})();// 使用var a = Singleton.getInstance();var b = Singleton.getInstance();console.log(a === b); // true
ES6 Class + 静态属性方式(推荐)
更符合现代写法,清晰易读,也支持延迟初始化:
立即学习“Java免费学习笔记(深入)”;
class Logger { constructor() { if (Logger.instance) { return Logger.instance; } this.logs = []; Logger.instance = this; } log(msg) { this.logs.push(msg); }}// 手动绑定初始实例(可选)Logger.instance = null;// 使用const logger1 = new Logger();const logger2 = new Logger();console.log(logger1 === logger2); // true
注意:这种写法依赖构造函数内判断,需确保所有调用都走 new Logger(),否则可能绕过单例逻辑。更稳妥的方式是禁用直接 new,只暴露静态工厂方法:
class Config { constructor(data) { this.data = data; } static getInstance() { if (!Config._instance) { Config._instance = new Config({ env: 'prod' }); } return Config._instance; }}// 使用const c1 = Config.getInstance();const c2 = Config.getInstance();
模块级单例(最自然的 JS 方式)
利用 ES6 模块的单例特性——模块默认导出本身就是单例,无需额外封装:
// config.jsexport default { apiUrl: 'https://api.example.com', timeout: 5000, setEnv(env) { this.env = env; }};// main.jsimport config from './config.js';import config2 from './config.js';console.log(config === config2); // true ✅
这是 JavaScript 中最轻量、最可靠、也最符合语言习惯的单例实现,适合大多数场景。
基本上就这些。单例不复杂但容易忽略边界情况,比如多线程(JS 是单线程,所以不用考虑竞态),重点是控制好实例的创建和复用逻辑。模块导出方式最推荐,简洁又安全。
以上就是javascript的设计模式有哪些_单例模式如何实现?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1542830.html
微信扫一扫
支付宝扫一扫