マルチプルインスタンスクロージャ(改) 複数クロージャ
最近クロージャばっかりだが、性懲りも無く続ける。
前回はクロージャ関数がひとつだけだったので、直接関数オブジェクトを返せばよかったが、複数メソッドを外部からアクセスできるようにするには?
とりあえず素直に考えたのがコンストラクタを使うもの。
コンストラクタのローカル変数を内部関数で参照し、内部関数をインスタンスで保持する。
コードは以下
'use strict'; // closure var myCounter; if (!myCounter) { myCounter = {}; // 名前空間オブジェクト生成 // コンストラクタ(エンクロージャ) myCounter.Create = function () { var cnt = 0; // クロージャ // カウントアップ this.CountUp = function () { return ++cnt; }; // カウントダウン this.CountDown = function () { return --cnt; }; // カウンタクリア this.Reset = function () { return cnt = 0; }; } } var cnt0 = new myCounter.Create; var cnt1 = new myCounter.Create; console.log('cnt0:' + cnt0.CountUp()); console.log('cnt0:' + cnt0.Reset()); console.log('cnt0:' + cnt0.CountDown()); console.log('cnt1:' + cnt1.CountDown()); console.log('cnt1:' + cnt1.CountUp()); console.log('cnt0:' + cnt0.CountDown()); console.log('cnt1:' + cnt1.CountUp());
他方、ローカル変数に内部関数を保持して返す形も考えられる。こっちの方が正攻法なのだろうか?
'use strict'; // closure var myCounter; if (!myCounter) { myCounter = {}; // 名前空間オブジェクト生成 // コンストラクタ(エンクロージャ) myCounter.Closure = function () { var cnt = 0; // クロージャ var closure = {}; // クロージャをプロパティ保持する。 // カウントアップ closure.CountUp = function () { return ++cnt; }; // カウントダウン closure.CountDown = function () { return --cnt; }; // カウンタクリア closure.Reset = function () { return cnt = 0; }; // クロージャを返す return closure; } } var cnt0 = myCounter.Closure(); var cnt1 = myCounter.Closure(); console.log('cnt0:' + cnt0.CountUp()); console.log('cnt0:' + cnt0.Reset()); console.log('cnt0:' + cnt0.CountDown()); console.log('cnt1:' + cnt1.CountDown()); console.log('cnt1:' + cnt1.CountUp()); console.log('cnt0:' + cnt0.CountDown()); console.log('cnt1:' + cnt1.CountUp());