在JavaScript开发中,单例模式用来确保某个对象在应用生命周期内只被创建一次,并对外提供统一访问入口。这种模式在管理全局状态、缓存数据和配置信息时非常实用。

什么是单例模式
单例模式属于创建型设计模式,其核心目标是限制类的实例化次数,并保证全局可以访问同一个实例。在JavaScript里,由于语言本身没有传统类的强制约束,实现方式更加灵活。
常见的创建方式
1. 使用对象字面量
最简单的方式是直接用对象字面量,因为它本身就是一个唯一的对象:
// 对象字面量本身就是单例
const Singleton = {
count: 0,
increment: function() {
this.count++;
return this.count;
}
};
console.log(Singleton.increment()); // 1
console.log(Singleton.increment()); // 2
这种写法直观,但无法延迟初始化,也不方便在创建时执行复杂逻辑。
2. 使用闭包实现私有实例
通过闭包可以把实例保存在私有作用域中,仅暴露获取方法:
const Singleton = (function() {
let instance;
function createInstance() {
return {
name: '唯一实例',
say: function() {
return this.name;
}
};
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.log(a === b); // true
3. 使用ES6类
在ES6中可以用类的静态属性控制实例唯一性:
class Singleton {
constructor() {
if (Singleton.instance) {
return Singleton.instance;
}
this.data = [];
Singleton.instance = this;
}
add(item) {
this.data.push(item);
}
}
const s1 = new Singleton();
const s2 = new Singleton();
console.log(s1 === s2); // true
使用建议
如果只需要简单共享数据,对象字面量足够;若需要延迟加载或封装创建逻辑,闭包或类的方式更合适。注意在模块化开发中,模块本身也具备单例特性,可优先使用模块导出代替手动实现。
单例虽好,但过度使用会造成全局耦合,应结合实际需求权衡。
| 方式 | 优点 | 缺点 |
|---|---|---|
| 对象字面量 | 写法简单 | 无法延迟初始化 |
| 闭包 | 可私有化实例 | 代码稍复杂 |
| ES6类 | 结构清晰 | 需手动控制实例 |
JavaScript单例模式设计模式修改时间:2026-07-31 01:42:17