javascript - node js中的面向对象编程

标签 javascript node.js oop logging

我有一个基本问题如下:

我在同一个目录中有 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;

现在,我想像这样在主模块中使用我的记录器:

var logger = require('./logger.js');
logger.init('MAIN');

logger.log('foo');

但是 Node 坚持认为 Logger 没有名为 initlog 的方法。我还尝试了 require('./logger.js')(),因为我正在传递一个返回自身对象的函数,但它没有帮助。在其他模块中定义对象并导出它们的最佳做法是什么?顺便说一句,它恰好通过这样做来工作:

var logger = require('./logger.js');
var l = new logger();
l.init('MAIN');
l.log('bar');

然而,这对我来说似乎很笨拙。有什么解释和建议吗?

最佳答案

你有一个构造函数;这就是 prototype 的用途。如果你想要一个全局记录器对象,你需要导出一个全局记录器对象:

var logger = {};

logger.log = function(str) {
    console.log('[' + logger.mPrefix + ']' + str);
};

logger.init = function(pr) {
    logger.mPrefix = pr;
};

module.exports = logger;

或者,您可以导出 Logger 的实例:

module.exports = new Logger();

这是一个最小的变化,并且在您确实想要公开构造函数的情况下将进行最小的变化。

如果您确实想要创建多个 Logger 实例,您就会被构造函数困住——但不用担心,这是一件好事。您也可以用构造函数替换 init

function Logger(pr) {
    this.prefix = pr;
}

Logger.prototype.log = function(message) {
    console.log("[%s] %s", this.prefix, message);
};

module.exports = Logger;

var Logger = require("./logger");
var logger = new Logger("MAIN");

关于javascript - node js中的面向对象编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19083926/

相关文章:

javascript - 如何在 jQuery DatePicker 中隐藏下一个/今天/上一个导航并关闭动画?

javascript - 在同一页面上呈现新建/创建和编辑/更新表单

MySQL 嵌套关系

javascript - "Error: path must be a string"(v5.10.0)

oop - wxPython中wx.TextCtrl的值设置问题

oop - 基于组件的游戏引擎中的通信

javascript - 连接输出 - 初级函数

javascript - useCallback 并传入参数

node.js - 如何保护 Redis 和 Socket.IO 实时服务器,以便只有经过身份验证的用户才能收听?

c# - 如何从不同的文件引用 C# 类?