首页 > 解决方案 > ES6 中的单例不持久化实例

问题描述

这很接近,但是,它会在每次调用此模块时一遍又一遍地创建实例,因为我认为该变量每次都在一个新的函数构造函数中:

export const DB = () => {
    const dbInstance;

    function getInstance() {
        if (!dbInstance) {
            const db = newDb();
            db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));
            dbInstance = db;
        }
        return dbInstance;
    }
    return {
        getInstance,
    };
};

export default DB;

我搬出dbInstance去了,它可以工作,但是感觉很脏,因为我知道dbInstance它没有被封装并且仍然可供消费者使用,他们仍然可以导入它:

let dbInstance;

export const DB = () => {
    function getInstance() {
        if (!dbInstance) {
            const db = newDb();
            db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));
            dbInstance = db;
        }
        return dbInstance;
    }
    return {
        getInstance,
    };
};

export default DB;

那么,我将如何正确地执行第一个示例,并在没有我的黑客攻击的情况下修复它,基本上?

标签: javascript

解决方案


ES6 模块,就像 CommonJS 模块一样,是单例的。因此,在 ES6 中实现单例的最简单和正确的方法是:

const db = newDb();
db.public.none(fs.readFileSync('src/DB/migrations/001-initial.sql', 'utf8'));

export default db;

推荐阅读