[解決済み] Node.js - module.exports をコンストラクタとして使用する。
質問
Node.jsのマニュアルによると。
モジュールのエクスポートのルートを関数にしたい場合(例えば コンストラクタのような)関数にしたい場合、または一度に完全なオブジェクトをエクスポートしたい場合は 一度に1つのプロパティを構築する代わりに、1つの割り当てで完全なオブジェクトをエクスポートしたい場合、それを モジュールに割り当てます。
与えられた例では
// 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モジュールでは、エクスポートされたプロパティを定義するために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モジュールでそのようなものを見ないということです。
コンストラクタで要求する
に直接関数をアタッチすることができるので
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"
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsのmodule.exportsとexportsの比較
-
[解決済み】CommonJsモジュールシステムのmodule.exportsとexportsの違いについて
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptの "new "キーワードは有害とみなされるか?
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] javascriptでオプションのパラメータを扱う
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] JavaScriptデータフォーマット/プリティプリンタ