在构造函数中使用return来包装节点模块

时间:2014-12-18 10:49:15

标签: javascript node.js ecmascript-6

我正在玩Node和ES6,我正在尝试将一些Node模块包装成类(在本例中为bunyan)。我的目标是统一我在我的应用程序中使用模块(我和我的模块)的方式(不确定它是一件好事)。

我想出了一个包含类构造函数返回的工作解决方案。但我不确定这是一个很好的方法。有什么想法吗?

这就是我正在做的事情:

var bunyan = require('bunyan');

export default class Logger {

  constructor(options) {
    return bunyan.createLogger(options);
  }
};

所以我可以这样使用它:

var logger  = new Logger({name: "server.js"});

1 个答案:

答案 0 :(得分:1)

这实际上是一个意见问题,但有几个(大部分)客观要点:

如果你这样做......

  • 一个对象由new运算符创建,然后被丢弃(假设V8优化器没有发现它可以跳过它)。

  • 你回来的logger而不是 Logger类(logger instanceof Logger的一个实例,这是相当误导的假)。从构造函数返回对象以覆盖new创建的对象的能力主要用于返回由构造函数创建的先前实例,该实例等同于您要求的实例(主要用于单例或不可变对象) ,以避免重复。)

  • 使用new Logger隐藏了这样一个事实,即你得到的东西实际上是一个bunyan记录器,这可能会让人们无法维护代码。

你是否考虑过这些" cons"是否是一个意见问题。

另一种选择是让Logger 使用一个bunyan记录器而不是直接返回它。如果你决定将bunyan换成其他东西,那么这也可以封装它。