Как создать синглтон-классы в Javascript? - PullRequest
1 голос
/ 07 января 2020

Я работаю над большим проектом, в котором у меня есть несколько менеджеров для выполнения разных задач, мне нужно, чтобы при запуске приложения был создан только один объект этих менеджеров,

Я сталкивался с этим методом создания синглтона

class QuestionnaireManager {

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

Является ли это приемлемым способом, есть ли минус, я исхожу из JAVA Kotlin фона, и кажется, что это просто так, когда нам приходится иметь дело с случай синглетонов на других языках. (Большинство из этих случаев имеют дело с многопоточностью, но поскольку JS является однопоточным, так что я думаю, что этого будет достаточно)

Все еще нужно мнение о передовых методах или любых других методах внедрения зависимостей, где мы даже не полагаемся на Singleton, но создаем объект один раз и используем его во всем проекте с помощью инъекций зависимостей.

Мне бы хотелось узнать мнение о Sens ie в JS.

Ответы [ 3 ]

1 голос
/ 07 января 2020

Это не правильный способ реализации Singleton в ES6. Правильный путь:

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 голосов
/ 07 января 2020

В javascript вы можете экспортировать экземпляр класса для создания синглтона

// questionnaire-manager.js
class QuestionnaireManager {

  constructor() {
  }
}

module.exports = new QuestionnaireManager()

Затем, когда вы вызываете require('questionnaire-manager'), вы всегда получите один и тот же экземпляр.

0 голосов
/ 07 января 2020

Вам нужно свойство stati c, а не свойство instance this.instance. Он будет доступен по ссылке QuestionnaireManager.instance. Но ... это очень редкий случай для реализации классического синглтона GOF в Javascript ... своего рода принуждение себя к разработке пользовательского интерфейса в vim и ощущению себя как "настоящего разработчика":)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...