Можно ли требовать, чтобы класс создавал новый экземпляр без необходимости каждый раз вызывать новый? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть модуль следующим образом:

class mailer() {
   constructor() {
     this.template = "";
     this.email = "";
   }

   setTemplate(tplName) {
     this.template = tplName;
     return this;
   }

   sendEmail(email) {
     //some stuff
   }
}

module.exports = mailer;

И чтобы потреблять это, вы просто делаете:

const mailer = require('mymodule');

(new mailer()).setTemplate("foo").sendEmail('foo@bar.com');

Причина, по которой я использую класс, заключается в том, что несколько процессов могут использовать этот модуль одновременно, поэтому мне нужно, чтобы переменные были изолированы. Это работает как задумано, но я бы хотел сделать код чище, удалив, если возможно, «новую» часть. Я могу экспортировать экземпляр класса вместо того, чтобы экспортировать сам класс, но тогда Node будет кэшироваться после первого запроса, и мой код будет использовать один и тот же экземпляр каждый раз.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Создайте фабрику с геттером в файле Mailer и экспортируйте фабрику:

const mailerFactory = {
  get mailer() {
    return new Mailer();
  }
};

module.exports = mailerFactory;

Теперь вы можете создать новый экземпляр, вызвав:

const mailer = require("./Mailer").mailer;

mailer.setTemplate("foo").sendEmail('foo@bar.com');

Рабочий пример - посмотрите на консоль.

0 голосов
/ 07 сентября 2018

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

module.exports = function() { return new mailer() };

const createMailer = require('mymodule');

createMailer().setTemplate("foo").sendEmail('foo@bar.com');

Нет, вы не должны пытаться экспортировать экземпляр, и вы не должны пытаться творить магию, которая обновляет экспорт после доступа к нему.

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