前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS单例模式

JS单例模式

原创
作者头像
剁椒鱼鳞
发布2023-05-26 15:26:20
4500
发布2023-05-26 15:26:20
举报
文章被收录于专栏:前端小学生

采用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了,进而导致了不是单列模式了。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档