如何在Javascript中创建单例类?

问题描述 投票:1回答:3

[我正在一个大型项目中,我有多个经理来处理不同的任务,启动应用程序时,我只需要创建这些经理的一个对象,

我遇到过这种创建Singleton的方法

class QuestionnaireManager {

  constructor() {
    if (this.instance) {
      return;
    }
    this.instance = this;
  }
}

这是一种可接受的方法,有没有不利之处,我来自JAVA Kotlin背景,在其他语言的单例情况下,我们需要处理很多事情,这似乎很简单。 (大多数情况下必须处理多线程,但是由于JS是单线程的,所以我认为这是足够的方法)

仍然需要最佳实践方面的意见,或者甚至不依赖Singleton而是创建对象并通过依赖项注入在整个项目中重复使用的其他任何依赖项注入方法。

我想知道JS中sensie的意见。

javascript reactjs singleton
3个回答
1
投票
这不是在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"

0
投票
在javascript中,您可以导出类的实例以形成单例

// questionnaire-manager.js class QuestionnaireManager { constructor() { } } module.exports = new QuestionnaireManager()

然后,当您调用require('questionnaire-manager')时,您将始终获得相同的实例。

-1
投票
您需要一个静态属性,而不是实例属性this.instance。可以通过QuestionnaireManager.instance参考进行访问。但是...用Java语言实现经典的GOF单例的情况很少见...强制自己在vim中开发UI并觉得yoursefl是“真正的开发者”:)
© www.soinside.com 2019 - 2024. All rights reserved.