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

标签 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');

最佳答案

您可能知道,出现警告是因为名称开头带有上限的函数通常是 JavaScript 中的构造函数。

如果需要,您可以使用 new 调用现有的 Logger。这会创建并丢弃一个对象,但这是无害的。它之所以有效,是因为如果构造函数返回非 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

关于javascript - 在构造函数中,将构造的对象设置为另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40128628/

相关文章:

javascript - Backbone 重新排序了一个集合,以便家始终是第一位的?

javascript - JavaScript 中的闭包和 "this"关键字问题

javascript - 测试用 Jest 覆盖 console.log

node.js - Express Validator 的值无效

javascript - 无效传输,必须是具有日志方法的对象 winston mongodb logging

javascript - 如何使用 Winston 3 记录完整的堆栈跟踪?

javascript - 用于分隔文本的前瞻

javascript - 如何停止其他功能启动的音频?

javascript - Phantom.js - 如何使用 promise 而不是回调?

node.js - winston-elasticsearch 在记录时创建回调错误