【问题标题】:Is it possible to require a class creating a new instance without having to call new every time?是否可以要求一个类创建一个新实例而不必每次都调用 new ?
【发布时间】:2019-02-12 18:58:59
【问题描述】:

我有一个模块如下:

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 会在第一次请求后缓存,并且我的代码每次都会使用相同的实例。

【问题讨论】:

标签: node.js ecmascript-6


【解决方案1】:

如果只是 new 困扰您,请导出一个工厂函数,而不是在没有 new 的情况下调用它来创建新实例:

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

const createMailer = require('mymodule');

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

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

【讨论】:

    【解决方案2】:

    在 Mailer 文件中创建一个带有 getter 的工厂,并导出该工厂:

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

    现在你可以通过调用来创建一个新实例:

    const mailer = require("./Mailer").mailer;
    
    mailer.setTemplate("foo").sendEmail('foo@bar.com');
    

    工作 example - 查看控制台。

    【讨论】:

    • 这与@Bergi 的建议几乎相同,但是您使用 GET 的事实使它变得非常优雅!谢谢! (老实说,我不知道 get)
    • @DomingoSL 答案是正确的,但是像这样的东西一点也不优雅。像这样的吸气剂更加晦涩难懂,几乎不推荐使用。仅当您想在弄清楚 require("./Mailer").mailer !== require("./Mailer").mailer 之前绞尽脑汁的开发人员时才考虑在现实生活中这样做。顺便说一句,.mailer 需要比() 输入更多的字符。
    • @estus 我确实更改了 Ori Drori 建议的命名,以使我的代码更清晰。我不同意这不优雅的事实。在我看来,使用 () 来执行一个返回带有函数的对象的函数一直是 JS 中的一种解决方法。虽然“.mailer”确实比“()”大,但在require中只写一次,之后每次发送电子邮件时都省去“()”。
    • @DomingoSL 调用工厂函数是每个开发人员无需多说就能理解的常规做法。描述符提供了很大一部分伏都教,即使您忘记了该模块的处理方式,也可能会使您感到困惑。优雅与否,由于这些问题,您不会在编写良好的模块导出中看到这个技巧,而不是因为其他开发人员不知道如何使用描述符。
    • @DomingoSL - 每次需要新实例时都需要调用 .mailer - 这与调用函数相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 2017-10-06
    • 2013-12-18
    相关资源
    最近更新 更多