CommonJS模块允许两种方法来定义导出的属性。无论哪种情况,您都将返回对象/功能。因为函数是JavaScript中的一等公民,所以它们可以像对象一样操作(从技术上讲,它们是对象)。就是说,您有关使用new
关键字的问题有一个简单的答案:是的。我会说明...
模块出口
您可以使用exports
提供的变量将属性附加到该变量。一旦在另一个模块中需要,这些分配属性将变为可用。或者,您可以将一个对象分配给module.exports属性。无论哪种情况,所返回的require()
都是对的值的引用module.exports
。
有关如何定义模块的伪代码示例:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
在上面的示例中,module.exports
和exports
是相同的对象。最酷的部分是,您不会在CommonJS模块中看到任何内容,因为整个系统都会为您提供帮助,因此您所需要知道的是,有一个带有exports属性和指向变量的export变量的模块对象module.exports也做同样的事情。
需要构造函数
因为您可以直接将函数附加到函数上module.exports
,所以基本上可以返回一个函数,并且像其他任何函数一样,都可以将其作为构造函数进行管理(这用斜体表示,因为JavaScript中的函数和构造函数之间的唯一区别是您打算如何使用它。没有区别。)
因此,以下代码非常好,我个人鼓励这样做:
// My module
function MyObject(bar) {
this.bar = bar;
}
MyObject.prototype.foo = function foo() {
console.log(this.bar);
};
module.exports = MyObject;
// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"
要求非建设者
对于类似非构造函数的函数也是如此:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
square
到Square
的new square()
不再存在。