JavaScript設(shè)計(jì)模式之單體模式全面解析
單體是一個(gè)用來(lái)劃分命名空間并將一些相關(guān)的屬性與方法組織在一起的對(duì)象,如果她可以被實(shí)例化的話(huà),那她只能被實(shí)例化一次(她只能嫁一次,不能二婚)。
單體模式是javascript里面最基本但也是最有用的模式之一。
特點(diǎn):
1. 可以用來(lái)劃分命名空間,從而清除全局變量所帶來(lái)的危險(xiǎn)或影響。
2. 利用分支技術(shù)來(lái)來(lái)封裝瀏覽器之間的差異。
3. 可以把代碼組織的更為一體,便于閱讀和維護(hù)。
單體模式的基本寫(xiě)法:
/* 最基本的單體模式 */ var her = { name: 'Anna', sex: 'women', say: function(){ // 一些處理邏輯...... }, doing: function(){ // 另一些處理函數(shù)...... } }
1. 劃分命名空間:
var box = { width: 0, height: 0, getArea: function(){ return this.width * this.width; // js中對(duì)象成的訪(fǎng)問(wèn)必須是顯示的,即this是不能省略的 }, init: function(w, h){ // width = w; // height = h;這種方式相當(dāng)于定義了兩個(gè)全局變量,(沒(méi)加var聲明的變量為全局變量) // 并不是對(duì)對(duì)象width和height的賦值 // 下面是正確的 this.width = w; this.height = h; } } //box劃分了一個(gè)命名空間,命名空間里的變量只在空間里有效
上面的單體中的所有的成員以及方法都是公有的(public),也就是在單體的外部可以對(duì)她們進(jìn)行任意的改動(dòng)(但不能訪(fǎng)問(wèn)其中的局部變量),那為什么說(shuō)單體提供了一個(gè)命名空間呢?
別急,我們接著往下看:
var box = { width:0, height:0,//單體的變量 getArea:function(){ return width * height;// width,height其實(shí)并不是單體的變量,而是在init中定義的全局變量 } init:function(w,h){ width = w; height = h; } }// init中width,height其實(shí)并不是單體的變量 window.onload = function(){ var init = box.getArea(); alert(init); }
由于沒(méi)有對(duì)init中的width,height進(jìn)行初始化,所以會(huì)報(bào)錯(cuò),這樣改一下:
var box = { width:0, height:0, getArea:function(){ return width * height; }, init:function(w,h){ width = w; height = h; } } window.onload = function(){ width = 0; height = 0; //or box.init(0,0); var init = box.getArea(); alert(init); }
發(fā)現(xiàn)可以了,由于init和 getArea所用的width和height并不是歸單體所有的變量,而是一個(gè)全局變量,所以我們可以在單體外面進(jìn)行隨意調(diào)用而不受影響、
var box = { width: 0, height: 0, getArea: function(){ return width * height;//js中對(duì)象成的訪(fǎng)問(wèn)必須是顯示的,即this是不能省略的 }, init:function(w,h){ width = w; height = h; } }//這里的width,height其實(shí)并不是單體的對(duì)象 window.onload = function(){ width = 0; height = 0; var width = box.getArea(); alert(width); }
這樣寫(xiě)又會(huì)報(bào)錯(cuò)了,可見(jiàn)我們以上的方式對(duì)于全局變量并沒(méi)有建立起一個(gè)命名空間,全局變量為我們帶來(lái)了危險(xiǎn)。所以最上面的寫(xiě)法是對(duì)的,我們來(lái)驗(yàn)證一下:
var box = { width: 2, height: 2, getArea: function(){ return this.width * this.height;/ /js中對(duì)象成的訪(fǎng)問(wèn)必須是顯示的,即this是不能省略的 }, init:function(w,h){ this.width = w; this.height = h; } } window.onload = function(){ width = 0; // 不會(huì)影響單體中的局部變量也就是命名空間 height = 0; // 不會(huì)影響單體中的局部變量也就是命名空間 var width = box.getArea(); alert(width); }
可見(jiàn)在window.onload中的width 和height已經(jīng)沒(méi)有干擾了,因?yàn)閱误w為單體中的width和height建立了一個(gè)命名空間。
2. 成員的屬性:
雖然在javascript中沒(méi)有這么嚴(yán)格的面向?qū)ο?oop),但是我們可以借助閉包來(lái)進(jìn)行一個(gè)模仿,畢竟有的變量設(shè)為public是很不好的。
var her = (function(){ var name = 'Anna'; var sex = 'women'; return { getArea: function(){ return name + 'is a' + sex; }, init:function(b){ name = b; } } })(); window.onload = function(){ her.name = 'Jock'; // 無(wú)法訪(fǎng)問(wèn) alert(ger.getArea()); her.init('Lous'); alert(her.getArea()); }
私有變量、方法是只讀的,公有變量、方法是可讀可寫(xiě)的。
訪(fǎng)問(wèn):
對(duì)于私有成員,直接訪(fǎng)問(wèn)即可,前面不用加任何修飾,
對(duì)于公有的訪(fǎng)問(wèn)在單體作用域內(nèi)前面要加上“this.”,在單體作用域外前面要加上“her.”(單體名字.)
3.利用分支技術(shù)來(lái)來(lái)封裝瀏覽器之間的差異
注意的地方:
a. 一定要用閉包,實(shí)現(xiàn)即時(shí)綁定
b. 每個(gè)分支之間用分號(hào)隔開(kāi)
c. 最后返回的是分支的名字
d. 調(diào)用的時(shí)候用單體名+分支的方法名;
// 利用單體的分支技術(shù)來(lái)定義XHR(XMLHttpRequest)對(duì)象,必須要用閉包才可以實(shí)現(xiàn) var XHR = (function(){ //The three branches var standard = { cXHR:function(){ return new XMLHttpRequest(); } }; var activeXNew = { cXHR:function(){ return new ActiveXObject('Msxml2.XMLHttp'); } }; var activeXOld = { cXHR:function(){ return new ActiveXObject('Microsoft.XMLHttp'); } }; //To assign(分配) the branch, try each method;return whatever doesn't fail var testObject; try{ testObject = standard.cXHR(); return standard;// return this branch if no error was thrown }catch(e){ try{ testObject = activeXNew.cXHR(); return activeXNew; }catch(e){ try{ testObject = activeXOld.cXHR(); return activeXOld; }catch(e){ throw new Error('Create the XMLHttpRequestObject failed!'); } } } })(); window.onload = function(){ alert(XHR.cXHR()); }
以上所述是小編給大家介紹的JavaScript設(shè)計(jì)模式之單體模式全面解析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JavaScript中實(shí)現(xiàn)單體模式分享
- javascript 單例/單體模式(Singleton)
- javascript 設(shè)計(jì)模式之單體模式 面向?qū)ο髮W(xué)習(xí)基礎(chǔ)
- javascript設(shè)計(jì)模式之模塊模式學(xué)習(xí)筆記
- javascript設(shè)計(jì)模式之策略模式學(xué)習(xí)筆記
- JavaScript 設(shè)計(jì)模式 安全沙箱模式
- javascript設(shè)計(jì)模式 接口介紹
- 小議javascript 設(shè)計(jì)模式 推薦
- JavaScript設(shè)計(jì)模式之觀(guān)察者模式(發(fā)布者-訂閱者模式)
- javascript設(shè)計(jì)模式之單體模式學(xué)習(xí)筆記
相關(guān)文章
微信頁(yè)面彈出鍵盤(pán)后iframe內(nèi)容變空白的解決方案
當(dāng)鍵盤(pán)彈出后,頁(yè)腳也被頂起來(lái);而當(dāng)搜索完(要刷新整體頁(yè)面),鍵盤(pán)縮回后,iframe里 鍵盤(pán)當(dāng)住的地方變成白色。怎么解決這個(gè)問(wèn)題呢?下面腳本之家小編給大家分享微信頁(yè)面彈出鍵盤(pán)后iframe內(nèi)容變空白的解決方案,一起看看吧2017-09-09Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例
本篇文章主要是對(duì)Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02JavaScript中的for...of和for...in循環(huán)容易遇到的問(wèn)題及解決方法總結(jié)
在 JavaScript 編程中,for...of 和 for...in 是常用的循環(huán)語(yǔ)法,但它們?cè)谑褂脮r(shí)可能會(huì)引發(fā)一些意想不到的問(wèn)題,本文將分享我在使用這兩種循環(huán)時(shí)所遇到的坑和經(jīng)驗(yàn),需要的朋友可以參考下2023-08-08通過(guò)函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈
這篇文章給大家分享了通過(guò)函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友參考學(xué)習(xí)下。2018-08-08詳解javascript實(shí)現(xiàn)自定義事件
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)自定義事件的方法,自定義事件,顧名思義,就是自己定義事件類(lèi)型,自己定義事件處理函數(shù),javascript如何實(shí)現(xiàn)自定義事件,需要了解的朋友可以參考下2016-01-01原生js實(shí)現(xiàn)水平方向無(wú)縫滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)水平方向無(wú)縫滾動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01