px5*_*5x2 3 javascript oop logging node.js
我有一个基本问题如下:
我在同一目录中有2个独立的模块main.js和logger.js.logger.js简单地说:
function Logger(){
return this;
};
Logger.prototype.log = function(str) {
console.log('[' + this.mPrefix + ']' + str);
};
Logger.prototype.init = function(pr){
this.mPrefix = pr;
}
module.exports = Logger;
Run Code Online (Sandbox Code Playgroud)
现在,我想在主模块中使用我的记录器,如下所示:
var logger = require('./logger.js');
logger.init('MAIN');
logger.log('foo');
Run Code Online (Sandbox Code Playgroud)
但节点坚持认为Logger没有命名的方法init或log.我也尝试过require('./logger.js')(),因为我传递的函数返回自我对象,但它没有帮助.在其他模块中定义对象并导出它们的最佳实践是什么?顺便说一句,它恰好通过这样做:
var logger = require('./logger.js');
var l = new logger();
l.init('MAIN');
l.log('bar');
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说似乎很笨拙.有什么解释和建议吗?
Ry-*_*Ry- 14
你有一个构造函数; 这prototype是为了什么.如果需要一个全局记录器对象,则需要导出一个全局记录器对象:
var logger = {};
logger.log = function(str) {
console.log('[' + logger.mPrefix + ']' + str);
};
logger.init = function(pr) {
logger.mPrefix = pr;
};
module.exports = logger;
Run Code Online (Sandbox Code Playgroud)
或者,您可以导出以下实例Logger:
module.exports = new Logger();
Run Code Online (Sandbox Code Playgroud)
这是一个最小的更改,如果您想要公开构造函数,将最小化更改.
如果你确实想要创建多个Logger实例,那么你就会遇到一个构造函数 - 但不用担心,这是件好事.您也可以替换init构造函数.
function Logger(pr) {
this.prefix = pr;
}
Logger.prototype.log = function(message) {
console.log("[%s] %s", this.prefix, message);
};
module.exports = Logger;
Run Code Online (Sandbox Code Playgroud)
和
var Logger = require("./logger");
var logger = new Logger("MAIN");
Run Code Online (Sandbox Code Playgroud)