[英]Is a Node.js module a singleton?
我曾经以这种方式实现单例:
class MySomething {
constructor(props) {}
}
let myInstance = null;
module.exports = (props) => {
//first time call
if(props) {
myInstance = new MySomething (props);
return myInstance;
} else {
return myInstance;
}
这假设在 app.js (入口文件)我将首先调用:
require('./MySomething')(props)
然后在我使用的项目中的任何地方:
const instanceOfSomething = require('./MySomething')();
我发现每次我得到一个新实例时!
我的代码有什么问题?
我也试过这样:
class MySomething {...}
const mySomething = (function() {
let myInstance = null;
return {
init: function() {
myInstance = new MySomething();
},
getInstance: function() {
return myInstance ;
}
}
})();
module.exports = mySomething;
从不同文件导入这个模块时我遇到了一些问题,任何人都可以向我解释一下吗?
文件的每个要求都会创建 mySomething 的新实例
更新
我现在尝试了这个例子:
class MySomething {...}
const mySomething = {
myInstance: null,
init: function() {
myInstance = new MySomething();
},
getInstance: function() {
return myInstance ;
}
}
};
module.exports = mySomething;
也出现了同样的问题,可能和我的项目结构有关,这里解释一下:
下面的代码属于模块“事实”
fact 文件夹包含一个名为“dao”的文件夹,此文件夹包含我拥有的 fact/index.js 中的 MySomething.js(单例):
const Localstorage = require('./dao/MySomething');
exports.init = (path) => {
Localstorage.init(path)
}
exports.Localstorage = Localstorage;
现在在一个名为“core”的文件夹中,其中包含“facts”文件夹,我再次在“index.js”中重新导出了 Localstorage,如下所示:
const facstModule = require('./facts');
exports.Localstorage = facstModule.Localstorage;
然后在包含“Runtime.js”的“schedule”文件夹中我写:
const { Localstorage } = require('../core');
setTimeout(() => {
const localstorageIns = Localstorage.getInstance(); //this is always null!
}, 5000)
在 app.js 文件(入口点)中,我做了:
const facts = require('./src/facts');
facts.init(__dirname);
通常会在超时执行回调之前创建实例,但我注意到有两个 Localstorage 实例是单例的
文件的每个要求都会创建 mySomething 的新实例,因为每次您使用init
方法和getInstance
方法返回新对象时。
如果你需要单例,你需要这样做:
class MySomething {
constructor() {
if (!MySomething.instance) {
MySomething.instance = this;
}
}
getInstance: function() {
return MySomething.instance;
}
}
module.exports = MySomething;
做单例最干净的方法是
class MyClass () { ... }
module.exports = new MyClass()
如果您需要一个实例化一次的单例,我会这样做:
class MyClass () { ... }
let myClass
const MyClassSingleton = (...args) => {
if (myClass) {
return myClass
}
myClass = new MyClass(...args)
return myClass
}
module.exports = MyClassSingleton
class Singleton {
constructor() {
this.my_obj;
}
static makeObject() {
if (!this.my_obj) {
this.my_obj = new Singleton();
}
return this.my_obj;
}
add() {
return 1
}
}
// so to get the object we need to call the makeobject method
const obj = Singleton.makeObject()
console.log(obj.add());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.