成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript編程模式:模塊的力量

開發 前端
模塊模式是基于JavaScript閉包實現的一個模式,這篇文章描述如何用模塊模式來支持多人大型項目,此外,需要自己做框架的同學也可以參考。

模塊模式是一個常用的JavaScript編程模式。它很好理解,但是還有一些高級的使用方法沒有引起廣泛的注意。如果你已經非常了解模塊模式,可以跳到"高級模式"的段落。

51CTO推薦閱讀:JavaScript中的函數式編程實踐

匿名閉包

匿名閉包是讓一切成為可能的基礎,而且這也是JavaScript最好的特性。我們創建個簡單的匿名函數看看。函數內運行的代碼都存在于閉包內,這個閉包在整個應用的生命周期內都保持私密和自己的狀態。(相關閱讀:揭開Javascript閉包的真實面目

  1. (function () {   
  2. // 所有的var和function都只存在于當前作用域內   
  3. // 仍然可以讀取到所有的全局變量   
  4. }());  

注意:包住匿名函數的"()"。這是JavaScript語言本身的要求,因為由function開頭的代碼一律被識別為"函數聲明",用()包住則創建了一個函數表達式。

引用全局變量

JavaScript有個特質隱含的全局變量。無論一個name是否使用過,JavaScript解釋器反向遍歷作用域鏈查找這個name的var聲明,如果沒找到var,則這個對象是全局的。這意味著在一個匿名閉包中使用和創建全局變量很容易。不幸的是這讓代碼難與管理,對閱讀代碼的人來說很難區分哪些變量是全局的。幸好,我們的匿名函數提供了一個簡單的替代方案。將全局變量作為參數傳入匿名函數,這比用隱含全局變量更清晰更快速。例子:

  1. (function ($, YAHOO) {   
  2. // 使用全局的 jquery 比如$ 和 YAHOO   
  3. }(jQuery, YAHOO));  

模塊導出

當你不僅僅想使用全局變量,還想聲明一些(全局變量)的時候。我們可以很方便地用匿名函數的返回值來導出(全局變量)。 這么做就是一個完整的模塊模式基本形態。例子:

  1. var MODULE = (function () {   
  2. var my = {},   
  3. privateVariable = 1;   
  4. function privateMethod() {   
  5. // …   
  6. }   
  7. my.moduleProperty = 1;   
  8. my.moduleMethod = function () {   
  9. // …   
  10. };   
  11. return my;   
  12. }());  

我們聲明了一個全局變量”MODULE”, 有兩個公有屬性: 分別是一個方法MODULE.moduleMethod和一個變量MODULE.moduleProperty。除此之外,它用匿名函數的閉包保持自己的私有內部狀態。同時根據上一個例子,我們還可以很方便的引用全局變量。

高級模式

上面的內容對大多數用戶已經很足夠了,但我們還可以基于此模式發展出更強大,易于擴展的結構。

增生

模塊模式的一個限制是整個模塊必須寫在一個文件里。在大型編碼項目里工作的人都知道代碼分成多個文件的重要性。幸好,我們又一個很好的解決方案。首先,我們導入模塊,然后我們添加屬性,然后我們再把它導出。例子:

  1. var MODULE = (function (my) {   
  2. my.anotherMethod = function () {   
  3. //添加一些方法   
  4. };   
  5. return my;   
  6. }(MODULE));  

為確保一致性我們再次使用var關鍵字,盡管這不是必須的。代碼運行后,我們的模塊會獲得一個新的公有方法MODULE.anotherMethod。這個增生的文件也保持自己的私密性,內部狀態和對他的導入。

松散增生

我們的上一個例子要求我們的初始化模塊必須先運行。而增生必須第二步發生。這不應該是必要的。JavaScript的好處之一就是可以異步的讀取腳本文件。我們可以創建靈活的多塊的模塊,用Loose Augmentation,他們可以按任何順序加載自己。每個文件應該有如下的結構:

  1. var MODULE = (function (my) {   
  2. // 添加一些功能   
  3. return my;   
  4. }(MODULE || {}));  

在這個模式下,var聲明總是必須的注意如果模塊還不存在,導入就會新建模塊。這意味著你可以使用類似LABJavaScript這樣的工具并行的讀取所有你的模塊文件,沒有任何的阻塞。

#p#

緊密增生

雖然松散增生很牛叉,但是這對你的模塊有一定的限制。最重要的是你不能安全的重載(override)你的模塊屬性.你也不能在初始化的時候就使用模塊的屬性。緊密增生包含一個加載順序,但是允許重載(override).例子:

  1. var MODULE = (function (my) {   
  2. var old_moduleMethod = my.moduleMethod;   
  3. my.moduleMethod = function () {   
  4. // 重載方法,可通過old_moduleMethod調用舊的方法   
  5. };   
  6. return my;   
  7. }(MODULE));  

這樣我們重載(override)了MODULE.moduleMethod,但如果需要,仍可保持對原方法的引用。

  1. Cloning and Inheritance 克隆和繼承   
  2. var MODULE_TWO = (function (old) {   
  3. var my = {},   
  4. key;   
  5. for (key in old) {   
  6. if (old.hasOwnProperty(key)) {   
  7. my[key] = old[key];   
  8. }   
  9. }   
  10. var super_moduleMethod = old.moduleMethod;   
  11. my.moduleMethod = function () {   
  12. //在克隆里重載方法,通過super_moduleMethod接入父級(super)   
  13. };   
  14. return my;   
  15. }(MODULE));  

這個模式可能是最靈活的選擇。他允許一些neat compositions。這會帶來一些靈活性上的代價。

跨文件私有狀態

將一個模塊劃分到多個文件的限制之一是每個文件保持它自己的私有狀態,而且不能解接入其他文件的私有狀態。這是可以解決的,下面的例子用松散增生模塊在多個增生之間保持私有狀態:

  1. var MODULE = (function (my) {   
  2. var _private = my._private = my._private || {},   
  3. _seal = my._seal = my._seal || function () {   
  4. delete my._private;   
  5. delete my._seal;   
  6. delete my._unseal;   
  7. },   
  8. _unseal = my._unseal = my._unseal || function () {   
  9. my._private = _private;   
  10. my._seal = _seal;   
  11. my._unseal = _unseal;   
  12. };   
  13. // 持久的接入 _private, _seal, 和 _unseal   
  14. return my;   
  15. }(MODULE || {}));  

任何文件都可以對他們的局部變量_private設屬性,并且設置對其他的文件也立即生效。一旦這個模塊加載結束,應用會調用 MODULE._seal()"上鎖",這會阻止外部接入內部的_private。如果這個模塊需要再次增生,應用的生命周期內,任何文件都可以調用_unseal() ”開鎖”,然后再加載新文件。加載后再次調用 _seal()”上鎖”。

子模塊

我們最后的高級模式是最簡單的,有很多好例子來創建子模塊,就像創建一個普通的模塊:

  1. MODULE.sub = (function () {   
  2. var my = {};   
  3. // …   
  4. return my;   
  5. }());  

盡管這很明顯,但我認為還是值得加進來的,子模塊具有一般模塊所有的高級能力,包括增生和私有狀態。

總結

大多數高級模式可以與其他的互相組合形成有用的模式。如果讓我來設計一個復雜應用的架構,我會組合使用loose augmentation, private state, 和 sub-modules.
這里我并沒有研究性能問題。但是我想順便提一句:模塊模式效率很好。代碼量可以更少,使加載代碼更快。使用 loose augmentation允許簡單的非阻礙式并行加載,這更可以提升下載的速度。初始化時間可能比其他方法要慢,但是這是值得的。

最后,這里有個sub-module動態的把自己加載到父模塊去(如果沒有則創建)。為了簡潔,這里沒有包含private state。這段代碼允許一個復雜的大型分層代碼庫并行的加載自己和它的子模塊:

  1. var UTIL = (function (parent, $) {   
  2. var my = parent.ajax = parent.ajax || {};   
  3. my.get = function (url, params, callback) {   
  4. // ok, so I’m cheating a bit    
  5. return $.getJavaScriptON(url, params, callback);   
  6. };   
  7. // etc…   
  8. return parent;   
  9. }(UTIL || {}, jQuery));  

原文鏈接:http://www.douban.com/group/topic/10456277/

【編輯推薦】

  1. 揭開Javascript閉包的真實面目
  2. JavaScript中的函數式編程實踐
  3. 深入淺出JavaScript內存泄漏
  4. 拔開云霧見明月 透析JavaScript定時機制
  5. 雕蟲無小技 JavaScript初學者的10個迷你技巧
責任編輯:王曉東 來源: 豆瓣
相關推薦

2012-10-29 13:25:54

JavaScriptJSjQuery

2024-04-02 08:00:00

函數式編程開發

2012-12-18 10:03:22

JavaScriptWebJS

2021-11-22 22:14:46

JavaScript開發模塊

2023-10-30 10:20:45

2020-12-22 09:32:36

JavaScripMixin mixins

2012-10-29 11:16:13

2020-12-25 10:28:41

JavaScript模塊module

2020-07-09 08:01:48

JavaScriptES模塊

2020-10-15 13:29:57

javascript

2025-05-14 08:20:15

2012-06-25 09:00:46

網絡

2013-04-01 15:25:41

異步編程異步EMP

2021-10-13 07:48:23

Options模式編程

2021-12-10 07:47:30

Javascript異步編程

2012-02-02 09:21:39

編程

2012-04-10 10:04:26

并行編程

2014-07-30 10:08:13

Python反模式

2021-02-19 14:07:03

JavaScript編程開發

2012-12-25 09:38:41

JavaScript設計模式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品日本 | 久久久国产一区二区 | 欧美色综合天天久久综合精品 | av乱码 | a级黄色片在线观看 | 成人精品一区 | 亚洲精品色 | 国产精品免费观看 | 一级毛片大全免费播放 | 青青草一区二区 | av网站免费观看 | 99亚洲国产精品 | 91小视频| 九九热精品在线视频 | 国产精品资源在线 | 色婷婷婷婷色 | 色精品| 成年网站在线观看 | 成人精品啪啪欧美成 | av黄色在线 | 久久精品一区二区视频 | 超碰在线网站 | 91久色 | 亚洲欧美在线视频 | 精品无码久久久久久国产 | 婷婷色在线播放 | 一区二区三区在线看 | 在线观看的av | 亚洲国产精品久久久久秋霞不卡 | 全免费a级毛片免费看视频免费下 | 欧美国产日韩精品 | 久久99精品视频 | 美女福利网站 | 欧美成年黄网站色视频 | 日韩三级电影一区二区 | 亚洲精品久久久一区二区三区 | 午夜a√ | 国产草草视频 | 成人免费观看视频 | a级毛片基地 | 插插插干干干 |