モジュールパターン - JavaScriptの個人的なメモ (その6)
二つのモジュールパターン
調べていくと、モジュールパターンの書き方に二通りありましたので、ここにメモとして、残しておきます。
即時関数を使ったモジュールパターン
ネットでよく見かけるデザインパターンが、即時関数を使ったモジュールパターンです。以下のとおり (注1)、即時関数を使います。
var myObject = (function ( ) { var value = 0; return { increment: function (inc) { value += typeof inc === 'number' ? inc : 1; }, getValue: function ( ) { return value; } }; }( ));
通常の関数としてのモジュールパターン
「JavaScript: The Good Parts」で紹介されています(注2)。普通に関数で定義しているパターンです。
var jMod = function ( ) { var value = 0; return { increment: function (inc) { value += typeof inc === 'number' ? inc : 1; }, getValue: function ( ) { return value; } }; };
二つの方式の違い
使い方については、関数を呼び出すかどうかの違いです。
/* 即時関数方式 */ myObject.increment(12); myObject.getValue(); /* 12 */ /* 通常方式 */ var s = jMod(); s.increment(12); s.getValue(); /* 12 */
ただし、前者の即時関数を使った方式は、グローバル変数を使った名前空間と同じなので、他の誰かに書き換えられるかもしれません。
myObject.increment = function(inc) { this._value = inc + 100; }; myObject.getValue = function() { return this._value; }; myObject.increment(12); myObject.getValue(); /* 112 */
結論
- モジュールパターンには二つの方式があります
- 即時関数を使う方式よりも通常の関数の方式のほうが安全です
参考資料
注1
Douglas Crockford 著 水野貴明 訳「JavaScript: The Good Parts」第6刷 p.43
コードは以下の正誤表から引用
http://www.oreilly.co.jp/books/9784873113913/#errata3
注2
Douglas Crockford 著 水野貴明 訳「JavaScript: The Good Parts」第6刷 p.48