我正在做一个大型项目,在这个项目中,我有多个管理人员来处理不同的任务,在启动应用程序时,我只需要创建这些管理器的一个对象,
我偶然发现了一种新的创作方法
class QuestionnaireManager {
constructor() {
if (this.instance) {
return;
}
this.instance = this;
}
}这是一种可以接受的方法吗?有什么缺点吗?我来自JAVA Kotlin背景,这似乎很简单,因为我们在其他语言中有太多的事情要处理。(大多数情况下必须处理多线程,但由于JS是单线程的,所以我认为这是足够的方法)
仍然需要对最佳实践或任何其他依赖项注入方法的意见,在这些方法中,我们甚至不依赖Singleton,而是只创建一次对象,然后在整个项目中使用依赖项注入重用。
我想知道JS中敏感的观点。
发布于 2020-01-07 10:21:27
这不是在ES6中实现Singleton的正确方法。正确的方法:
class QuestionnaireManager {
constructor() {
if (QuestionnaireManager._instance) {
throw new Error("Singleton classes can't be instantiated more than once.")
}
QuestionnaireManager._instance = this;
// ... your rest of the constructor code goes after this
}
}
var managerOne = new QuestionnaireManager()
var managerTwo = new QuestionnaireManager() // Throws error
或者,如果不希望在第二个实例创建时抛出错误,只需返回最后一个实例,如下所示:
class QuestionnaireManager {
constructor() {
if (QuestionnaireManager._instance) {
return QuestionnaireManager._instance
}
QuestionnaireManager._instance = this;
// ... your rest of the constructor code goes after this
}
}
var managerOne = new QuestionnaireManager()
var managerTwo = new QuestionnaireManager()
console.log(managerOne === managerTwo) // logs "true"
发布于 2021-12-02 03:17:34
// Singleton.js
class Singleton {
constructor(){
if(Singleton._instance){
console.warn("already created!");
return Singleton._instance;
}
Singleton._instance = this;
console.log("singleton created");
this._createdTime = new Date();
}
static instance() {
if(!Singleton._instance){
return new Singleton();
}
return Singleton._instance;
}
createdTime() {
return this._createdTime.toISOString();
}
}
Singleton._instance = null;
export default Singleton;
// main.js
import Singleton from "./Singleton"
const a = new Singleton();
const b = new Singleton();
const c = Singleton.instance();
console.log(a.createdTime());
console.log(b.createdTime());
console.log(c.createdTime());产出将

发布于 2020-01-07 10:22:29
在javascript中,您可以导出类的实例以生成单例。
// questionnaire-manager.js
class QuestionnaireManager {
constructor() {
}
}
module.exports = new QuestionnaireManager()然后,当您调用require('questionnaire-manager')时,您将始终得到相同的实例。
https://stackoverflow.com/questions/59626230
复制相似问题