コンストラクタ クロージャ

コンストラクタ クロージャ
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;
})();