2012-02-25 91 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

你可能會喜歡:HTTP:儘管我無法說出你在這裏看到的內容。 – Treffynnon 2012-02-25 12:51:23

回答

4

Knockback是一個命名空間。值存儲在Knockback內部,因此它們不會與任何全局變量衝突。

Observables是坐在Knockback內部的構造函數。所有的邏輯是模塊化

observales封閉((function() {})())用作返回的Observables實例的方法中,這是一種方式,人們可以使用什麼作爲「範圍安全構造」之稱。在JavaScript中,如果你調用一個沒有新建的構造函數,那麼這個對象默認爲window,再次污染你的全局命名空間。

我不知道你對javascript有多瞭解,但我希望這有助於。

-------------------------------- updated ------------- -

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 

我還想指出的是,男孩ES5營修復了這個問題,但嚴格的模式,並未在所有瀏覽器中實現,但(IE ..啊哈啊哈)

+2

實際上我沒有看到那個自我調用的匿名函數/閉包。沒有什麼關閉。此外,「構造函數」調用看起來太臃腫和不必要。 – jAndy 2012-02-25 13:01:13

+0

@jAndy Ive爲你更新了我的答案 – 2012-02-25 14:07:01