在构造函数中,将构造的对象设置为另一个

为了帮助我进行日志logging,我创build了一个便利函数,创build一个winston.Logger并将其设置为正确的传输,然后返回该logging器。

一切工作正常,但ESLint抱怨我调用它作为一个构造函数而不使用new

虽然我可以忽略这个警告,但是我喜欢有严格的规则,看到const logger = Logger('foo')确实令人困惑。

重命名LoggergetLogger似乎对我来说是丑陋的,但ESLint不抱怨。

我认为使Logger成为构造者,直接指向new winston.Logger的结果。

显然, this = new winston.Logger没有工作,但我很确定有一个干净的方法来做到这一点。

log.js当前片段:

 module.exports = (file) => { let transports = getTransports(file), logger = new (winston.Logger)({ rewriters: [ (level, msg, meta) => { meta.app = file + '.js'; return meta; } ], transports: transports }); return logger; // this = logger; }; 

使用:

 'use strict'; const Logger = require('./log.js'), logger = Logger('foo'); logger.debug('foo'); 

正如你可能知道的那样,警告是存在的,因为函数初始化的名字通常是JavaScript中的构造函数。

如果你愿意,你可以用new方式调用你现有的Logger 。 这将创build并扔掉一个对象,但这是无害的。 它的工作原理是因为如果一个构造函数返回一个非null对象引用, new的结果就是该对象引用,而不是由new创build的对象。 您的函数返回logger ,这是一个非null对象引用,所以它会工作。 (如果是我的话,我可能会把它getLogger并且只是正常地调用它来清楚它在做什么,但是这是一个风格问题,你曾经说过你不想这么做,这是公平的。 )

下面是一个简单的例子来演示new和构造函数的这种行为:

 var obj = { note: "I'm the one object Singleton always returns" }; function Singleton() { this.note = "This object is thrown away, so you never see this object"; return obj; } function Normal() { this.note = "This object isn't thrown away"; } var o1 = Singleton(); console.log("o1", o1); var o2 = new Singleton(); console.log("o1 === o2? ", o1 === o2); // true console.log("o1 === obj?", o1 === obj); // true var n1 = new Normal(); console.log("n1", n1); var n2 = new Normal(); console.log("n1 === n2?", n1 === n2); // false