是否可以要求一个类创建一个新实例而不必每次都调用new?

时间:2018-09-07 12:08:52

标签: node.js ecmascript-6

我有一个如下模块:

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 :(得分:4)

如果只是new困扰着您,请导出工厂函数,而无需new即可调用以创建新实例:

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

const createMailer = require('mymodule');

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

否,您不应尝试导出实例,也不应尝试使用任何魔术来访问导出后刷新导出的内容。

答案 1 :(得分:0)

在Mailer文件中使用吸气剂创建工厂,然后导出工厂:

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

module.exports = mailerFactory;

现在,您可以通过以下方式创建新实例:

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

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

工作example-查看控制台。