コンストラクタ クロージャ
コンストラクタ クロージャ
http://oshiete.goo.ne.jp/qa/8533773.html
これ(下)がいわゆるクロージャー。
小規模なプログラムには最適か?
引数a or b にHTML要素がある場合メモリーリークパターンになる可能性があり。
変数c, dは、外部から変更される心配がない。
関数zは、外部から利用されることがない。
なによりも関数e, fみたいなのが増えて、増量したらメンテナンスしづらい。
協同で作業し辛い、と思う。(協同で作業した時が無い!だから判らない)
function Hoge1 (a, b) { var c = a; var d = b; init (); function z () { // } function init () { // } return { e: function () { z (); return c; }, f: function () { return d; } }; }
this.c, this.d が外部から覗かれ、しかも弄られる可能性もある。
関数zは、外部から利用される可能性あり。無駄に見えているのが嫌いな人もいる。
関数e,fが増えてもそれぞれが独立しているので分担して作成できる。
いわゆるクロージャー型は、大きな風呂敷に全部入れて動く感じ。
こちらは、this という入れ物を使いまわす感じ。
function Hoge2 (a, b) { this.c = a; this.d = b; } Hoge.prototype.e = function () { this.z (); return this.c; }; Hoge.prototype.f = function () { return this.d; }; Hoge.prototype.z = function () { // }; Hoge.prototype.init = function () { // };
これが旧式ハイブリット型(AJAX(Asymmetrical JavaScript Abridgment Exclusively:非対称で排他的な JavaScript 短縮))←やっと過去から見つけた〜!
関数e,fは、呼び出し方を工夫して内部のプログラムの作り方は上と共通。
(function () { function Hoge3 (a, b) { this.c = a; this.d = b; } function e () { z (); return this.c; } function f () { return this.d; } function z () { // } function init () { // } function wrap (func) { var obj = this; return function (arg) { return func.apply (obj, arg); }; } function create (a, b) { var obj = new Hoge3 (a, b); init (); obj.e = wrap.call (obj, e); obj.f = wrap.call (obj, f); return obj; } hoge3.create = create; this.Hoge3 = hoge3; })();