根据Node.js手册:
如果您希望模块导出的根是一个函数(例如构造函数),或者想一次导出一个完整的对象而不是一次构建一个对象,则将其分配给module.exports而不是export 。
给出的示例是:
// file: square.js module.exports = function(width) { return { area: function() { return width * width; } }; }
并像这样使用:
var square = require('./square.js'); var mySquare = square(2); console.log('The area of my square is ' + mySquare.area());
我的问题:为什么示例不使用正方形作为对象?以下内容是否有效,是否会使示例更加“面向对象”?
var Square = require('./square.js'); var mySquare = new Square(2); console.log('The area of my square is ' + mySquare.area());
CommonJS模块允许两种方法来定义导出的属性。无论哪种情况,您都将返回对象/功能。因为函数是JavaScript中的一等公民,所以它们可以像对象一样操作(从技术上讲,它们是对象)。就是说,您有关使用new关键字的问题有一个简单的答案:是的。我会说明…
new
您可以使用exports提供的变量将属性附加到该变量。一旦在另一个模块中需要,这些分配属性将变为可用。或者,您可以将一个对象分配给module.exports属性。无论哪种情况,所返回的require()都是对的值的引用module.exports。
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属性和Exports变量的模块对象指向该对象。 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"