在构造函数中,将构造的对象设置为另一个
In a constructor, set the constructed object to another
为了帮助我进行日志记录,我创建了一个方便的函数来创建 winston.Logger
并使用正确的传输设置它,return 该记录器。
一切正常,但 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
。这将创建并丢弃一个对象,但这是无害的。它之所以有效,是因为如果构造函数 returns 是非 null
对象引用,则 new
的结果是该对象引用而不是 new
创建的对象。您的函数 returns 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
为了帮助我进行日志记录,我创建了一个方便的函数来创建 winston.Logger
并使用正确的传输设置它,return 该记录器。
一切正常,但 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
。这将创建并丢弃一个对象,但这是无害的。它之所以有效,是因为如果构造函数 returns 是非 null
对象引用,则 new
的结果是该对象引用而不是 new
创建的对象。您的函数 returns 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