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-这与调用函数是一样的。