JavaScript中的单例模式

admin4个月前网络知识27

单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点,在JavaScript中,由于其动态性和灵活性,实现单例模式的方法有很多,下面将详细介绍几种常见的实现方式。

JavaScript中的单例模式-图1

1. 构造函数+立即执行函数:

function Singleton() {
    if (typeof Singleton.instance === 'object') {
        return Singleton.instance;
    }
    this.name = 'Singleton';
    Singleton.instance = this;
    return this;
}
var instance1 = new Singleton();
var instance2 = new Singleton();
console.log(instance1 === instance2); // true

这种方式通过将构造函数私有化,并使用立即执行函数来创建唯一的实例,当第一次调用构造函数时,会创建一个新的对象并将其赋值给Singleton.instance,之后的所有调用都会返回这个已经创建的对象。

2. 静态属性+私有方法:

function Singleton() {
    if (typeof Singleton.instance === 'object') {
        return Singleton.instance;
    }
    this.name = 'Singleton';
    Singleton.instance = this;
}
Singleton.prototype = {
    constructor: Singleton,
    sayHello: function() {
        console.log('Hello, I am ' + this.name);
    }
};
var instance1 = new Singleton();
var instance2 = new Singleton();
console.log(instance1 === instance2); // true

这种方式通过将构造函数的原型设置为一个对象,并在该对象中定义一个静态属性instance和一个私有方法,静态属性用于存储唯一的实例,私有方法用于创建新的实例,当第一次调用构造函数时,会创建一个新的对象并将其赋值给Singleton.instance,之后的所有调用都会返回这个已经创建的对象。

3. 双重校验锁(DCL):

function Singleton() {
    if (!Singleton._instance) { // 第一次检查
        Singleton._instance = this; // 创建实例并赋值给_instance属性
        Singleton.__init(); // 初始化实例
    }
    return Singleton._instance; // 返回唯一实例
}
Singleton._instance = null; // 初始化_instance属性为null
Singleton.__init = function() { // 初始化方法,可以在这里进行一些初始化操作
    this.name = 'Singleton';
};
var instance1 = new Singleton();
var instance2 = new Singleton();
console.log(instance1 === instance2); // true

这种方式通过使用一个静态属性_instance和一个私有方法__init来实现单例模式,静态属性用于存储唯一的实例,私有方法用于初始化实例,当第一次调用构造函数时,会创建一个新的对象并将其赋值给Singleton._instance,之后的所有调用都会返回这个已经创建的对象,通过将构造函数的原型设置为一个空对象,可以避免其他代码修改构造函数的原型。

4. ES6中的Symbol和Map:

const Singleton = Symbol('Singleton'); // 使用Symbol作为构造函数的唯一标识符
class SingletonClass {
    constructor(name) {
        if (!this[Singleton]) { // 第一次检查
            this[Singleton] = name; // 创建实例并赋值给Singleton属性
        } else {
            return this[Singleton]; // 返回唯一实例
        }
    }
}
const instance1 = new SingletonClass('Instance 1');
const instance2 = new SingletonClass('Instance 2');
console.log(instance1 === instance2); // true

这种方式使用Symbol作为构造函数的唯一标识符,并通过Map来存储唯一的实例,当第一次调用构造函数时,会创建一个新的对象并将其赋值给this[Singleton],之后的所有调用都会返回这个已经创建的对象,通过将构造函数的原型设置为一个空对象,可以避免其他代码修改构造函数的原型。

以上是JavaScript中实现单例模式的几种常见方式,根据具体的需求和场景,可以选择适合的方式来实现单例模式,需要注意的是,单例模式可能会导致内存泄漏和性能问题,因此在使用时应谨慎考虑。

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

java:为什么我的对象看到构造函数中没有给它的变量?

java:为什么我的对象看到构造函数中没有给它的变量?

在Java中,构造函数是一种特殊的方法,用于初始化对象,当创建一个新的实例时,构造函数会被自动调用,构造函数的名称与类名相同,并且没有返回类型(即使是void也不需要写)。如果你的对象看到构造函数中没...