69

我想知道模塊模式或Constructor/protoType模式是否更適用於我的工作。Javascript:模塊模式vs構造函數/原型模式?

基本上我使用不顯眼的javascript - HTML文檔有一個對.js文件的引用。

我模塊模式的理解:

  • 調用的init方法(這基本上是一個公共方法我可以創建並返回使用模塊模式)
  • 在init方法中,將所有的點擊事件等

這聽起來像我的情況的最佳模式,因爲我並不需要創建對象和繼承層次等

我的構造/原型模式的理解:

  • 用於使用繼承創建對象
  • (即超類型的子類型)

我是否正確,爲了提供不引人注意的javascript,模塊模式是理想的?

回答

65

構造函數和原型是實現類和實例的合理方法之一。它們不完全對應於該模型,因此您通常需要選擇特定的方案或輔助方法來按原型實現類。 (Some background on classes in JS

模塊模式通常用於命名空間,在這裏您將有一個實例作爲存儲來分組相關的函數和對象。這與原型設計的好處不同。他們並不真正相互競爭;你可以很高興地一起使用它們(例如,在模塊中放置一個構造函數,並說new MyNamespace.MyModule.MyClass(arguments))。

+1

所以在我的情況下,我並不真正想創建實例,所以模塊模式可能是我想要的理想選擇。當你說namespacing ..我如何命名空間模塊模式?我看到了使用YUI的一種方式 - 但它真的有必要嗎? – Martin 2010-09-24 21:23:39

+15

沒有特別的竅門,你只需要使用一個JavaScript Object作爲查找。或者像'var MyModule = {someProperty:3,someFunction:function(){...},somethingElse:null};或者分配給'MyModule.someFunction = function(){...}; '。如果你想要私有變量,你可以在立即調用的函數表達式中做這件事,並在閉包中返回一個對象......我個人發現「真正的」私有變量完全浪費時間。 – bobince 2010-09-24 21:44:58

+0

偉大的建議全方位 – danjah 2010-11-22 02:11:20

10

模塊模式比原型更容易和更優雅。但是,首先想到移動。它不是中等/大型對象的相關模式,因爲初始化需要在啓動之前解析整個塊。多個閉包還會創建垃圾收集器沒有釋放的循環依賴(特別是IE),直到窗口(或標籤)關閉纔會釋放更大的內存佔用 - 檢查chrome任務管理器進行比較 - 加載時間爲與使用模塊模式的對象大小成反比,而原型繼承不是這種情況。 上面的陳述通過多個基準來驗證,例如:http://jsperf.com/prototypal-performance/54

如上一次測試中所見。小對象最好被初始化爲普通對象(沒有這些模式)。它適用於不需要關閉或繼承的單個對象。評估你是否需要這些模式是明智的。

4

你可以嘗試摺疊模式,這裏有一個鏈接: Javascript Folding Pattern

我也留下了一個答案類似的問題,這說明了如何使用摺疊模式:

Simple Example of Folding Pattern

+0

非常有趣的閱讀;謝謝 - 我從來沒有聽說過這種模式。 – 2015-03-09 21:43:53

4

原型模式可以幫助我們擴展功能,並且不管對象數量如何,內存中只有一個函數實例。在Module patter中,每個對象在內存中創建一個新的函數實例,但它提供了私有/公共變量的概念,並有助於封裝變量和函數。

+0

道格拉斯crockfords特權級方法,允許使用私人成員呢? – wayofthefuture 2015-08-25 20:50:51