节点js中的面向对象编程

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没有命名的方法initlog.我也尝试过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)