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

Node.js 是否可以要求类创建一个新实例,而不必每次都调用new?,node.js,ecmascript-6,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

我有一个模块如下:

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');

我之所以使用一个类,是因为几个进程可以同时使用该模块,所以我需要隔离变量。这可以按预期工作,但我希望尽可能删除“新”部分,从而使代码更干净。我可以导出类的一个实例,而不是导出类本身,但是节点将在第一个请求之后缓存,我的代码每次都将使用相同的实例。

如果只是
新的
困扰您,请导出一个工厂函数,您可以在不使用
新的情况下调用该函数来创建新实例:

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


不,您不应该尝试导出实例,也不应该尝试在访问导出后执行刷新导出的任何魔术。

如果只是
新的
困扰您,请导出一个factory函数,您可以在不调用
新的
的情况下调用该函数来创建新实例:

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


不,您不应尝试导出实例,也不应尝试在访问导出后执行刷新导出的任何操作。

在邮件文件中使用getter创建工厂,然后导出工厂:

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

module.exports = mailerFactory;
现在,您可以通过调用以下命令创建新实例:

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

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

工作-查看控制台。

在邮件文件中使用getter创建工厂,然后导出工厂:

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

module.exports = mailerFactory;
现在,您可以通过调用以下命令创建新实例:

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

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

工作-查看控制台。

。一点也不推荐,但似乎很相关。这与@Bergi的建议几乎相同,但您使用GET的事实使它看起来非常优雅!谢谢(老实说,我不知道get的事)@DomingoSL答案是正确的,但像这样的东西一点也不优雅。像这样的一个getter更为晦涩难懂,很难被推荐。在现实生活中,只有当你想同一个开发出他/她的大脑的程序员进行比较时,才可以考虑到<代码>需要(“./梅勒”)。需要(“./Mailer”).Mailer
。顺便说一句,
.mailer
()
@estus需要更多的字符来输入。我确实更改了Ori Drori建议的命名,以使代码更清晰。我不同意这样不优雅的事实。在我看来,在JS中,使用()执行返回包含函数的对象的函数一直是一种变通方法。虽然“.mailer”大于“()”是真的,但您只需在require中编写一次,然后每次发送电子邮件时都会使用“()”。@DomingoSL调用工厂函数是每个开发人员都理解的常规做法,不用说。描述符提供了伏都教的大部分内容,即使您忘记了该模块的处理方式,也可能会让您感到困惑。不管你是否优雅,你都不会在编写良好的模块导出中看到这种技巧,因为这些问题,而不是因为其他开发人员不知道如何使用描述符。@DomingoSL-每当你需要一个新实例时,你都需要调用.mailer-这与调用函数是一样的。这与@Bergi的建议几乎相同,但事实上,你用过GET使它变得如此优雅!谢谢(老实说,我不知道get的事)@DomingoSL答案是正确的,但像这样的东西一点也不优雅。像这样的一个getter更为晦涩难懂,很难被推荐。在现实生活中,只有当你想同一个开发出他/她的大脑的程序员进行比较时,才可以考虑到<代码>需要(“./梅勒”)。需要(“./Mailer”).Mailer
。顺便说一句,
.mailer
()
@estus需要更多的字符来输入。我确实更改了Ori Drori建议的命名,以使代码更清晰。我不同意这样不优雅的事实。在我看来,在JS中,使用()执行返回包含函数的对象的函数一直是一种变通方法。虽然“.mailer”大于“()”是真的,但您只需在require中编写一次,然后每次发送电子邮件时都会使用“()”。@DomingoSL调用工厂函数是每个开发人员都理解的常规做法,不用说。描述符提供了伏都教的大部分内容,即使您忘记了该模块的处理方式,也可能会让您感到困惑。不管是否优雅,您都不会在编写良好的模块导出中看到这种技巧,因为这些问题,而不是因为其他开发人员不知道如何使用描述符。@DomingoSL-您需要在每次需要新实例时调用.mailer-这与调用函数是一样的。