我有一个基本问题如下:
我在同一个目录中有 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
没有名为 init
或 log
的方法。我还尝试了 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/