js实现单例模式
实现单例模式的方法
在JavaScript中实现单例模式可以通过多种方式完成。以下是几种常见的实现方法:
使用对象字面量
最简单的单例模式实现方式是直接使用对象字面量。这种方式适用于不需要延迟初始化的情况。
const singleton = {
property: 'value',
method: function() {
console.log('Singleton method');
}
};
使用闭包和立即执行函数表达式(IIFE)
通过闭包和IIFE可以创建私有变量,并且延迟单例的初始化。

const Singleton = (function() {
let instance;
function createInstance() {
const object = new Object('I am the instance');
return object;
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true
使用ES6类
在ES6中,可以使用类的静态方法来实现单例模式。
class Singleton {
constructor() {
if (!Singleton.instance) {
Singleton.instance = this;
}
return Singleton.instance;
}
static getInstance() {
if (!this.instance) {
this.instance = new Singleton();
}
return this.instance;
}
}
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true
使用模块模式
在现代JavaScript中,模块本身就是单例的,可以利用这一特性实现单例模式。

// singleton.js
let instance;
class SingletonClass {
constructor() {
if (instance) {
throw new Error('You can only create one instance!');
}
instance = this;
}
}
const singleton = Object.freeze(new SingletonClass());
export default singleton;
使用Proxy
Proxy可以用于控制对象的创建行为,确保只创建一个实例。
function Singleton(targetClass) {
let instance;
return new Proxy(targetClass, {
construct(target, args) {
if (!instance) {
instance = new target(...args);
}
return instance;
}
});
}
class MyClass {
constructor() {
this.name = 'MyClass';
}
}
const SingletonClass = Singleton(MyClass);
const instance1 = new SingletonClass();
const instance2 = new SingletonClass();
console.log(instance1 === instance2); // true
选择适合的方法
选择哪种实现方式取决于具体需求:
- 对象字面量适用于简单的单例需求
- IIFE方式提供了更好的封装性
- ES6类方式更适合面向对象编程
- 模块模式适合现代模块化开发
- Proxy方式提供了更灵活的控制
每种方法都能确保在整个应用程序中只存在一个实例,开发者可以根据项目需求和编码风格选择最适合的实现方式。






