欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript設(shè)計(jì)模式之單體模式全面解析

 更新時(shí)間:2016年09月09日 13:43:08   作者:秋天的風(fēng),夏天的雨  
單體模式可以說(shuō)是javascript中最基本也是最有用的模式之一,接下來(lái)通過(guò)本文給大家解析js設(shè)計(jì)模式之單體模式,非常不錯(cuò),感興趣的朋友一起看看吧

單體是一個(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)站的支持!

相關(guān)文章

  • 微信頁(yè)面彈出鍵盤(pán)后iframe內(nèi)容變空白的解決方案

    微信頁(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-09
  • Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例

    Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例

    本篇文章主要是對(duì)Javascript和Java獲取各種form表單信息的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2014-02-02
  • JS中實(shí)現(xiàn)淺拷貝和深拷貝的代碼詳解

    JS中實(shí)現(xiàn)淺拷貝和深拷貝的代碼詳解

    JavaScript的變量中包含兩種類(lèi)型的值:基本類(lèi)型值 和 引用類(lèi)型值,這篇文章主要介紹了JS中實(shí)現(xiàn)淺拷貝和深拷貝,需要的朋友可以參考下
    2019-06-06
  • JavaScript中的for...of和for...in循環(huán)容易遇到的問(wèn)題及解決方法總結(jié)

    JavaScript中的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
  • 文件上傳插件SWFUpload的使用指南

    文件上傳插件SWFUpload的使用指南

    本文主要介紹了文件上傳插件SWFUpload使用指南,SWFUpload是一個(gè)flash和js相結(jié)合而成的文件上傳插件,其功能非常強(qiáng)大。需要的朋友可以參考下
    2016-11-11
  • javascript中如何判斷類(lèi)型匯總

    javascript中如何判斷類(lèi)型匯總

    這篇文章主要給大家介紹了關(guān)于javascript中如何判斷類(lèi)型的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用javascript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 通過(guò)函數(shù)作用域和塊級(jí)作用域看javascript的作用域鏈

    通過(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)自定義事件

    這篇文章主要為大家介紹了javascript實(shí)現(xiàn)自定義事件的方法,自定義事件,顧名思義,就是自己定義事件類(lèi)型,自己定義事件處理函數(shù),javascript如何實(shí)現(xiàn)自定義事件,需要了解的朋友可以參考下
    2016-01-01
  • JavaScript作用域與作用域鏈深入解析

    JavaScript作用域與作用域鏈深入解析

    這篇文章主要是對(duì)JavaScript作用域和作用域鏈作簡(jiǎn)單的介紹,希望能幫助大家更好的學(xué)習(xí)JavaScript
    2013-12-12
  • 原生js實(shí)現(xiàn)水平方向無(wú)縫滾動(dòng)

    原生js實(shí)現(xiàn)水平方向無(wú)縫滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)水平方向無(wú)縫滾動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論