2012-02-25 17 views
-1

誰かが私に次のJavaScriptデザインパターンの例とそれを達成しようとしていることを説明できますか?JavaScriptデザインパターン

var Knockback = { }; 
    Knockback.Observables = (function() { 

     function Observables(model, mappings_info, view_model) { 
      this.model = model; 
      this.mappings_info = mappings_info; 
      this.view_model = view_model; 


      //logic in here 
     } 
     Observables.prototype.destroy = function() { 
      //logic in here 


      this.view_model = null; 
      this.mappings_info = null; 
      return this.model = null; 
     }; 

     return Observables; 
    })(); 

Knockback.observables = function(model, mappings_info, view_model, options) { 
    return new Knockback.Observables(model, mappings_info, view_model, options); 
}; 
+1

(IE ...エヘンエヘン)ES5キャンプなど男の子は、この問題を修正することを指摘したいが、strictモードがまだすべてのブラウザで実装されていないあなたは好きかもしれませんします。http: //addyosmani.com/resources/essentialjsdesignpatterns/book/ここに表示されていることを説明することはできませんが、カバーされています。 – Treffynnon

答えて

4

Knockbackは名前空間です。値はKnockbackの内部に格納されるため、グローバル変数と衝突しません。

Observablesは、Knockbackの内部にあるコンストラクタです。ロジックのすべてがObservablesのインスタンスを戻す方法として使用されているモジュール性

observalesのため閉鎖((function() {})())の内側にされ、これが「スコープ安全なコンストラクタ」として知られていただきました!人が使用できる方法です。 javascriptでは、newを指定せずにコンストラクタを呼び出すと、このオブジェクトはデフォルトでwindowになり、グローバル名前空間が再び汚染されます。

javascriptについてどれだけ知っているのか分かりませんが、これが役立つことを願っています。

--------------------------------更新------------- -

1)クロージャは、クロージャなしの場合と同じですが、正しいです(私の答えの時点で私は "プライベート"変数がないことを知りませんでした)。しかし、このパターンはまた、あなたが好きな場所にこのコンストラクタを置くことを可能にします。名前空間(Knockback)名がKBに変更されたとします。クロージャ内のコード行を変更する必要がなくてもコンストラクタを配置することができます。

2)Knockback.observer関数は膨大である可能性がありますが、私は個人的にはそうは考えていませんが、「範囲の安全」係数はベストプラクティスとみなされます。検討してください:

var standardCorrectInvokation = new Knockback.Observer('model', 'mappings_info', 'view_model'); 

var aboutToLooseMyJobInvokation = Knockback.Observer('this', 'is', 'un-intuative'); 
//goodbye global namespace 
alert(window.model); // this 
alert(window.mappings_info); // is 
alert(window.view_model); // un-intuative 
//goodbye job at reputable web firm 

Idが

+2

実際には、私はその自己呼び出し匿名関数/クロージャーではあまり意味がありません。それが終わることはありません。また、 "コンストラクタ"コールはあまりにも肥大し、不必要であると思われます。 – jAndy

+0

@jAndy Iveがあなたのために私の答えを更新しました –

関連する問題