js单例模式

2023-10-28  本文已影响0人  猪猪行天下

整个项目运行期间只会在使用的时候被实例化一次。在其他语言中使用私有的构造方法或初始化方法,来保证实例不会被初始化多次。但是js中是没有这种私有方式的。如何你使用了ts那么就可以私有化构造方法来实现了。

当然js可以使用其他的方式来实现同样的功能。

方式一

通过模块化的方式,导出一个实例供其他使用。

class Video {}

const video = new Video();

export {
    video
}

这样看起来整个系统只有一个实例。但是它有一个隐患,例如:

import {video} from './singleton.js';

const VideoClass = Object.getPrototypeOf(video).constructor;
const video2 = new VideoClass();
console.log(video === video2); // false

这样我们发现它被重新实例化了。

方式二

通过代理的方式:

function singleton(className) {
    let instance;
    return new Proxy(className, {
        construct(target, args) {
            if(!instance) {
                instance = Reflect.construct(target, ...args);
                // 或
                // instance = new className(target, ...args);
            }
            
            return instance;
        }
    })
}

export default singleton;

在需要设置单例的类中这样使用如下:

import singleton from "./singleton";

class Video {}

export default singleton(Video);

在其他地方使用单例如下:

const  v1 = Video();
const v2 = Video();

console.log(v1 === v2); // true

这是一种比较好用的单例模式。可以安全的在代码中使用了。

上一篇 下一篇

猜你喜欢

热点阅读