CommonJS module允许通过两种方式定义导出的属性。无论哪种情况,您都将返回一个对象/函数。因为函数是 JavaScript 中的一等公民,所以它们可以像对象一样运行(从技术上讲,它们是对象)。也就是说,您关于使用new
关键字的问题有一个简单的答案:是的。我来说明...
module导出
您可以使用exports
提供的变量将属性附加到它。一旦在另一个module中需要这些分配属性就变得可用。或者您可以将一个对象分配给 module.exports 属性。在任何一种情况下,返回的require()
都是对 的值的引用module.exports
。
如何定义module的伪代码示例:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
在上面的例子中module.exports
和exports
是同一个对象。很酷的部分是,您在 CommonJS module中看不到任何内容,因为整个系统会为您处理这些问题,您只需要知道有一个带有导出属性的module对象和一个指向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"