在构造函数中,将构造的对象设置为另一个
为了帮助我进行日志logging,我创build了一个便利函数,创build一个winston.Logger
并将其设置为正确的传输,然后返回该logging器。
一切工作正常,但ESLint抱怨我调用它作为一个构造函数而不使用new
。
虽然我可以忽略这个警告,但是我喜欢有严格的规则,看到const logger = Logger('foo')
确实令人困惑。
重命名Logger
像getLogger
似乎对我来说是丑陋的,但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