CommonJSモジュールでは、2つの方法でエクスポートされたプロパティを定義できます。どちらの場合でも、オブジェクト/関数を返します。関数は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プロパティと、 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()
存在しません。