另外,這個模式和自執行的函數表達式比較相似,唯一的不同是module返回的是對象,而自執行函數表達式返回的是function。
眾所周知, JavaScript不想其它語言一樣有訪問修飾符,不能為每個字段或者方法聲明private,public修飾符,那這個模式我們是如何實現的呢?那就是return一個對象,里面包括一些公開的方法,這些方法有能力去調用內部的對象。
看一下,下面的代碼,這段代碼是一個自執行代碼,聲明里包括了一個全局的對象basketModule, basket數組是一個私有的,所以你的整個程序是不能訪問這個私有數組的,同時我們return了一個對象,其內包含了3個方法(例如addItem,getItemCount,getTotal),這3個方法可以訪問私有的basket數組。
同時注意,我們return的對象直接賦值給了basketModule,所以我們可以像下面一樣使用:
那在各個流行的類庫(如Dojo, jQuery)里是如何來做呢?
Dojo
Dojo試圖使用dojo.declare來提供class風格的聲明方式,我們可以利用它來實現Module模式,例如如果你想再store命名空間下聲明basket對象,那么可以這么做:
結合dojo.provide一起來使用,非常強大。
YUI
下面的代碼是YUI原始的實現方式:
jQuery
jQuery里有很多Module模式的實現,我們來看一個不同的例子,一個library函數聲明了一個新的library,然后創建該library的時候,在document.ready里自動執行init方法。
對象自面量
對象自面量使用大括號聲明,并且使用的時候不需要使用new關鍵字,如果對一個模塊里的屬性字段的publice/private不是很在意的話,可以使用這種方式,不過請注意這種方式和JSON的不同。對象自面量:var item={name: "tom", value:123} JSON:var item={"name":"tom", "value":123}。
CommonJS
關于 CommonJS的介紹,這里就不多說了,之前很多文章都有介紹,我們這里要提一下的是CommonJS標準里里有2個重要的參數exports和require,exports是代表要加載的模塊,require是代表這些加載的模塊需要依賴其它的模塊,也需要將它加載進來。
有很多CommonJS標準的模塊加載實現,我比較喜歡的是RequireJS,它能否非常好的加載模塊以及相關的依賴模塊,來一個簡單的例子,例如需要將圖片轉化成ASCII碼,我們先加載encoder模塊,然后獲取他的encodeToASCII方法,理論上代碼應該是如下:
但是上述代碼并沒用工作,因為encodeToASCII函數并沒用附加到window對象上,所以不能使用,改進以后的代碼需要這樣才行:
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com