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

时间:2016-10-19 10:22:50

标签: javascript node.js winston

为了帮助我进行日志记录,我创建了一个便捷函数,用于创建winston.Logger并使用正确的传输设置它,然后返回该记录器。

一切正常,但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');

1 个答案:

答案 0 :(得分:1)

正如您可能知道的那样,警告就在那里,因为具有初始上限名称的函数通常是JavaScript中的构造函数。

如果需要,您可以使用Logger拨打现有的new。这会创造并丢弃一个物体,但那是无害的。它的工作原理是,如果构造函数返回非null对象引用,则new的结果是该对象引用而不是new创建的对象。您的函数返回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