JavaScript中可用闭包+IIFE实现单例模式,核心是控制构造逻辑仅执行一次并缓存唯一实例;支持传参初始化、类语法封装及注意事项如避免暴露instance、异步处理等。

JavaScript 中可以用闭包封装私有实例变量,配合立即执行函数(IIFE)返回一个始终指向同一对象的引用,从而实现单例模式。核心在于:**控制构造逻辑只执行一次,并缓存唯一实例**。
用闭包 + IIFE 创建单例
这是最常见、最简洁的方式。闭包保护了内部的 instance 变量,外界无法直接修改或重新创建:
const Singleton = (function() {
let instance = null;
function createInstance() {
return {
data: Math.random(),
getName() { return 'Singleton Instance'; }
};
}
return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
// 使用
const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.log(a === b); // true
支持传参的增强版单例
如果需要初始化时传入配置,可以在首次调用 getInstance 时接收参数,并只在未创建实例时生效:
- 后续调用即使传参也忽略,确保唯一性
- 构造逻辑仍被闭包隔离,外部无法绕过 getInstance 直接访问
const ConfigurableSingleton = (function() {
let instance = null;
function createInstance(config = {}) {
return {
config,
id: Date.now(),
toString() { return `Singleton(${this.config.name || 'default'})`; }
};
}
return {
getInstance(config) {
if (!instance) {
instance = createInstance(config);
}
return instance;
}
};
})();
const s1 = ConfigurableSingleton.getInstance({ name: 'app' });
const s2 = ConfigurableSingleton.getInstance({ name: 'test' }); // 被忽略
console.log(s1.toString()); // "Singleton(app)"
console.log(s1 === s2); // true
类 + 闭包静态私有字段(ES6+)
借助类语法和闭包模拟“静态私有字段”,保持面向对象风格的同时维持单例约束:
const SingletonClass = (function() {
let instance = null;
class Singleton {
constructor(options) {
if (instance) {
return instance;
}
this.options = options;
this.createdAt = new Date();
instance = this;
}
}
return {
getInstance(options) {
if (!instance) {
return new Singleton(options);
}
return instance;
}
};
})();
const c1 = SingletonClass.getInstance({ debug: true });
const c2 = SingletonClass.getInstance({ timeout: 5000 });
console.log(c1 === c2); // true
注意点与常见误区
闭包单例看似简单,但容易踩坑:
- 不要在 getInstance 内部用 new Class() 每次新建——必须判断并复用已有 instance
- 避免把 instance 暴露到闭包外,否则可被外部赋值为 null 或其他值,破坏单例性
- 异步初始化需额外处理(如加载配置后才创建实例),此时应返回 Promise 并缓存 resolve 后的结果
- 模块级单例(如 ES Module)天然适合:导出对象本身即单例,无需手动管理 instance
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











