Javascript - хороший способ создать или разработать класс Singleton

Я думаю, что в javascript он может создать класс Singleton, как показано ниже

test.js
class Container {
    constructor() {
      this.map = new Map;
    }

    set(key, value) {
      this.map.set(key, value);
    }

    get(key) {
      return this.map.get(key);
    }
  }
module.exports.Container = new Container();

так что Я мог бы использовать эти другие файлы, например, в index.js

import container from './test'

Однако конструктору контейнера нужны другие параметры, чтобы он мог работать лучше. И контейнер также должен быть классом Singleton, потому что это общий класс. И я не знаю, как его создать?

constructor(servie) {
      this.map = new Map;
      this.servie = servie;
    }

кстати служебная переменная создается при запуске приложения

Как вы себе это представляете? Вы вызываете container('some value') и получаете объект, а затем вызываете container('some other value') и получаете тот же синглтон?

Mark 27.10.2018 17:25

@MarkMeyer Я хочу инициализировать класс контейнера при запуске приложения. И модуль. Затем экспортирует класс контейнера как класс Singleton, который может работать для другого модуля. И я не умею делать

NoDirection 28.10.2018 14:37
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
530
1

Ответы 1

Обновлено: Я понял, что мое именование немного сбивает с толку, поскольку я использовал контейнер для представления контейнера IoC, а затем понял, что вы использовали это имя для представления своего синглтона.

При условии, что вы можете создать экземпляр своего синглтона в центральной точке кода (например, в файле точки входа при настройке сервера). Вы можете получить синглтон несколькими способами. Например:

let instance = null;
class Singleton {
  constructor(arg1, arg2) {
    this.arg1 = arg1;
    this.arg2 = arg2;
  }
}

module.exports = (...args) => {
  return instance || (instance = new Singleton(...args));
}

Вы можете сделать это множеством способов, например. со статическими функциями вместо анонимной функции. Тем не менее, со всем этим, я думаю, возникает небольшая путаница относительно того, инициализируете ли вы экземпляр или просто пытаетесь его получить.

На мой взгляд, шаблоны контейнеров IoC (часто используемые в проектах C#) немного чище. Где у вас может быть один класс контейнера, который отслеживает ваши синглтоны и предоставляет отдельные функции доступа и запуска.

class Container {
  constructor() {
    this.instances = {};
  }

  add(name, instance) {
    this.instances[name] = instance; // depends if you want overwrite or not
  }

  get(name) {
    if (!this.instances[name]) {
      throw new Error('some appropriate error messaging for your app');
    }
    return this.instances[name];
  }

  remove(name) {
    delete this.instances[name];
  }
}

module.exports = new Container(); // this has to be a no-param constructor

Затем в коде инициализации приложения вы инициализируете синглтоны и регистрируете их в своем контейнере:

const Container = require('<path_to_Container>');
const Singleton = require('<path_to_Singleton>');
...
Container.add('mySingleton', new Singleton(arg1, arg2));

и получить к нему доступ в любое время с помощью:

Container.get('mySingleton');

Примечания для пар:

  • Вы можете использовать Singleton.name вместо имени строки (в примере - mySingleton)
  • Это просто личное предпочтение. Но мне это нравится, потому что он кажется более декларативным: вы регистрируете (добавляете) экземпляр в контейнер при запуске приложения и не стираете границы между инициализацией и использованием. А это означает, что если вы добавите больше этих синглтонов в будущем, у вас уже будет единый шаблон для них.

Другие вопросы по теме