Javascript 我可以用原型的方式在Node.js中使用require()吗?

Javascript 我可以用原型的方式在Node.js中使用require()吗?,javascript,node.js,require,Javascript,Node.js,Require,我一直对使用JavaScript进行原型编程感兴趣,我正试图找到一种使用节点模块进行编程的有效方法 例如,我想使用原型在我的每个模块中快速创建一个debug对象,该对象具有name属性和log方法,通过以下方式构造: 自定义_模块/debug.js var settings = require('custom_modules/settings'); exports = function debug(name){ this.name = name; this.log = fun

我一直对使用JavaScript进行原型编程感兴趣,我正试图找到一种使用节点模块进行编程的有效方法

例如,我想使用原型在我的每个模块中快速创建一个
debug
对象,该对象具有
name
属性和
log
方法,通过以下方式构造:

自定义_模块/debug.js

var settings = require('custom_modules/settings');

exports = function debug(name){

    this.name = name;
    this.log = function(message){

        if (settings.debug == 'true'){

             console.log("[Debug][" + name + "]: " + message);

        }

    }

}
所以我想知道我是否可以将该模块用作构造函数,如下所示:

做点什么

var debug = new require('custom_modules/debug')("Something Doer");

debug.log("Initialized"); // -> [Debug][Something Doer] : Initialized

它能工作吗?如果不能,正确的等价物是什么?

new
不关心函数来自何处。因此,是的,该功能可能是
require
ing模块的结果

但是,模块必须直接导出函数。在您当前的代码中,您只是将一个新值赋给局部变量
导出
变量,我们都知道赋给局部变量不会产生超出其范围的任何影响

模块仍将导出空对象。您必须覆盖
模块
导出
属性:

module.exports = function() {...};

正如所指出的,优先级会有问题,所以您必须这样做

var debug = new (require('custom_modules/debug'))("Something Doer");

事实上本地
exports
变量最初充当
module.exports
的别名,因此除非覆盖它,否则它看起来可以与module.exports相同的方式使用。我还不擅长在Node中使用模块,但答案是这样的。是的,
module.exports===exports
(我从来没说过不是)。但如果将新值指定给
导出
,则
模块.exports!==导出
require
返回的值是
module.exports
的值,而不是本地变量
exports
。下面是一个简化的例子:
varfoo={bar:42};var bar=foo.bar;巴=21;console.log(foo.bar,bar)。请注意,
foo.bar
仍保留其原始值。您在示例中使用的
new
方式错误。您尝试使用
require
函数作为构造函数来创建新的类实例,而不是创建新的
debug
实例。更多信息请参见。啊,没错。我已经修好了@LeonidBeschastny事实上,由于Felix在他的回答中注意到了这一点,我删除了修正,以保持该答案与Q保持一致。@LeonidBeschastny