2016-10-19 3 views
1

Чтобы помочь в моем протоколировании, я создал функцию удобства, которая создает 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

Как вы, наверное, знаете, предупреждение есть, поскольку функции с исходно-блокированных имен, как правило, конструктор функции в 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

+1

Спасибо, это также ограничивает модификации я должен делать в кодовую. :) Что касается стиля, я увижу, что моя команда должна сказать об этом в обзоре кода, но так как это не хаки, и им тоже не нравится импортировать уникальную функцию с 'require', это решение идеально. – DrakaSAN