JS单例模式

2023-05-26 15:26:20 浏览数 (2)

采用proxy代理,或者控制new的时机,通过调用特定的方法来new,new的时候判断是否已经new过,但此方法不能往原型上追加东西。

代码语言:javascript复制
export function singleton(className) {
    let ins;
    // 通过代理,解决不能往原型追加方法问题
    return new Proxy(className, {
        construct(target, args) {
            if (!ins) {
                ins = new target(...args);
            }
            return ins;
        }
    })
    // 此方法不能往原型追加方法
    // return class {
    //     constructor(...args) {
    //         if (!ins) {
    //             ins = new className(...args);
    //         }
    //         return ins;
    //     }
    // }
}

class Notice {

}
export default singleton(Notice);
const notice = new Notice();

当然,除上述方案外,还有其他方案,需Notice类内再写一个getInstance方法,方法内部即:

代码语言:javascript复制
static _ins; //实例
getInstance(name) {
    if (!this._ins) {
        return this._ins = new Notice();

    }
    return this._ins;

}

这样的话,外部调用的时候,统一都不采用new,而是直接调用notice.getInstance()方法,但是此方法会有一个风险问题,即:如果大家协同开发时,不能保证大家都采用getInstance方法进行new,可能就会有小伙伴直接new了,进而导致了不是单列模式了。

0 人点赞