不(bù)能(néng)不(bù)明(míβαng)白(bái)的(de)JavaScr→€↕↔ipt設計(jì)模式
日(rì)期:2013-05-09發布:首創網絡浏覽:533次
不(bù)能(néng)不(bù)明(mín±≠₩g)白(bái)的(de)JavaScript設計(jì)模式。可≠®✔↓(kě)靠的(de)設計(jì)模式是(s×¶•hì)可(kě)維護軟件(jiàn)的(de)基石,如(rú)果你(nǐ)↕&✘σ曾參與技(jì)術(shù)面試,很(hěφ≥ ✘n)有(yǒu)可(kě)能(néng)被問(wèn)到(dào)關于設計(j£₽§→ì)模式的(de)這(zhè)類東(dōng)西(xī)。下←©(xià)面這(zhè)個(gè)指南(π♠♠♥nán)中,我們将學習(xí)一(yī)些(xiē )今天就(jiù)可(kě)以用(yòng)得(de)著(z ∞↔ he)的(de)設計(jì)模式。 什(shén€∑∞§)麽是(shì)設計(jì)模式? 簡單來(lái)說(shuō)™>,設計(jì)模式就(jiù)是(shì)對(duì)特定類型·σ→'··
本文(wén)關鍵字:不(bù)能(néng),不(bù)明(míng☆ ♠✘),白(bái)的(de),JavaScriσ$&pt,設計(jì)模式,不(bù)能(néng),不(→σbù)明(míng),
不(bù)能(néng)不(bù)明(míng)白(bái)的(de)βφ<JavaScript設計(jì)模式。可(kě)靠的(de)" σ✘設計(jì)模式是(shì)可(kě)維護軟件(jiàn)的(de≠₩→)基石,如(rú)果你(nǐ)曾參與技(jì)術(shù₽φ)面試,很(hěn)有(yǒu)可(kě)能(néng)被問(wèn)♠到(dào)關于設計(jì)模式的(de)這(zγφ↕ hè)類東(dōng)西(xī)。下(xià)面這(zhè)個(gè)指÷✘→南(nán)中,我們将學習(xí)一(yī)些(xiē) ∞σ今天就(jiù)可(kě)以用(yòng)得(de)著(zhe)的(de)™&設計(jì)模式。
什(shén)麽是(shì)設計(★₹♣jì)模式?
簡單來(lái)說(shuō),設計(j♦✘©λì)模式就(jiù)是(shì)對(duì)特定類型問(wèn)π"題重用(yòng)的(de)軟件(jiàn)解決方案,&÷ γ這(zhè)些(xiē)問(wèn)題在軟件(jiàn)開(kāi)發的(β ≥¶de)時(shí)候經常會(huì)碰到&¶♠λ(dào),通(tōng)過很(hěn)多(duō)年(nián)的(de☆$)實踐,專家(jiā)對(duì)一(yī)些(xiē)相(x÷★iàng)似地(dì)問(wèn)題總結出一(yī)些(xiē)方法®←×,這(zhè)些(xiē)方法就(jiù)封裝成為(wè≈"®≥i)一(yī)種設計(jì)模式,所以:
模式是(shì)一(yī)種經驗證的(de)♣↓δ用(yòng)于解決軟件(jiàn)開(kāi)發問(wèn)題的♥®(de)方案。
模式是(shì)可(kě)擴展的(de),因為(wèi)他(tā)們經Ω ₽™常被結構化(huà)而且你(nǐ)需要(y± εφào)遵循某些(xiē)規則。
對(duì)于相(xiàng)似的(de)問(wèn)題,←©α模式可(kě)被重用(yòng)
在接下(xià)來(lái)的(de)教程中,我>₩←→們将直接給出一(yī)些(xiē)設計(jì)模式的(de)例子(zǐ)。
設計(jì)模式的(de)種類
軟件(jiàn)開(kāi)發中,設計(jì)模式通(tōn★ ≈g)常分(fēn)為(wèi)幾種類别,在這(zhè)篇教程中我們重點₽δ 介紹以下(xià)三種:
1、創建型模式專注于構建對(duì)象或者類,對(duì)£↕$象的(de)創建聽(tīng)起來(lái)很(hěn)€¥>簡單(在某些(xiē)情況下(xià)),但(€βαdàn)是(shì)大(dà)型應用(yòng)需要(yào)控制(zhì)×←≈對(duì)象的(de)創建過程。
2、結構型設計(jì)模式專注于管理(lǐ)對(≤<duì)象之間(jiān)的(de)關系使得(de€ )應用(yòng)是(shì)用(yòng)一(yīΩ↕→♠)種可(kě)擴展的(de)架,,結構型模式關鍵點是(shì)'¶¶确保在應用(yòng)程序中部分(fēn)改變不(bù)會(h←¥€uì)影(yǐng)響其他(tā)部分(fēn)。
3、行(xíng)為(wèi)模式專注于對(duì)象間(jiā✔≥n)的(de)通(tōng)信
你(nǐ)可(kě)能(néng)在讀(dú)完這(≥÷>zhè)些(xiē)簡介的(de)描述後仍然覺¶得(de)有(yǒu)問(wèn)題,這(zhè)很(h§αěn)正常,一(yī)旦我們看(kàn)完了(le)↑®δ£這(zhè)些(xiē)模式的(de)深入介紹後,問(wèn©±★)題也(yě)會(huì)變得(de)明(míng)朗起來(σ ¶≈lái),所以接著(zhe)往下(xià)看(kàn)吧(ba)。
類在JavaScript中的(de)注意點:
當我們讀(dú)設計(jì)模式時(shí),你(nǐ)經常¥ ¶會(huì)提及到(dào)類和(hé)對(₩•π&duì)象。這(zhè)很(hěn)疑惑,因為(wèi)JavaScr≠★<ipt沒有(yǒu)真正“類”的(de↓€)構造,一(yī)個(gè)更合适的(de)術(shù)語叫±₽“數(shù)據類型”♣£。
JavaScript中的(de)數(s×∞≠hù)據類型:
JavaScript是(shì)一(yī)門(mén)面向對(duì)象≠♣Ω的(de)語言,一(yī)個(gè)對(duì)象繼承自(zì)其他(tā)對∑©↔(duì)象,這(zhè)個(gè)概念以原型繼承著✔π稱。一(yī)個(gè)數(shù)據類型可(kě)以通(tōφ↑☆↔ng)過構造函數(shù)創建,就(jiù>≥ ↑)像:
functionPerson(config¥$>&){
this.name=config.γαname;
this.age=config.age;
}
Person.prototype.getAge=function()≤${
returnthis.age;
};
vartilo=newPerson({name:πσ“Tilo”,age:23});
console.log(tilo.getAge());
當方法定義在Person數(shù)±♠據類型中時(shí)注意prototype的(de)使用(yòng),★§由于多(duō)個(gè)Person對(duì)象将引用(yòng)同一£<§(yī)個(gè)prototype,這(zhè)樣就(jiù)允許g §•etAge()方法可(kě)以被所有(yǒu)的(de →)Person數(shù)據類型的(de)實例共享。而不(bù)是(shì)每個(gè)實例都(dōu)重新定義一(y≤∞≈₽ī)次,除此之外(wài),任何繼承自(zì)&↔πPerson的(de)數(shù)據類型都(dōu)可(kě)以訪問(wèn↓≤)getAge()方法。
處理(lǐ)私有(yǒu)數(shù)據
在JavaScript中另一(yī)個(★ gè)常見(jiàn)的(de)問(wèn)題是(shì)沒有(yǒu)♥↔↓ 真正意義上(shàng)的(de)私有(yǒu)變量,然而我們可(kě)±★α≈以使用(yòng)閉包
去(qù)模拟私有(yǒu)變量,考慮下(xià)¥ 面這(zhè)代碼片段:
varretinaMacbook=(function(){
//Privatevariables
varRAM,addRAM;
RAM=4;
//Privatemethod
addRAM=function(addition☆βalRAM){
RAM+=additionalRAM;
};
return{
//Publicvariablesandm<↕★ethods
USB:undefined,
insertUSB:function(device){
this.USB=device;
},
removeUSB:function(){
vardevice=this.USB;
this.USB=undefined;
returndevice;
}
};
})();
在上(shàng)面這(zhè)個(gè₩¶)例子(zǐ)中,我們創建了(le)一(y>©∏÷ī)個(gè)retinaMacbook對(duì)象,含有(yǒu€↓₩)公有(yǒu)和(hé)私有(yǒu)變量及方法,可(kě§☆γ)以這(zhè)樣來(lái)使用(yòng)它:
retinaMacbook.insertUSB(“my&↕USB”);
console.log(retinaMacbook.USB);>//logsout“myUSB”
console.log(retinaMacbook.RAM∞↑)//logsoutundefined
在JavaScript中函數(sh↑ù)和(hé)閉包可(kě)以做(zuò)更多(duō)的(de)事(s₽™↓>hì),但(dàn)是(shì)我們在這(z ∏hè)個(gè)教程中沒法涉及到(dào)方方面面,÷λφ我們簡短(duǎn)的(de)學習(xí)÷→了(le)JavaScript的(de)"α©數(shù)據類型和(hé)私有(yǒu©δ)變量。現(xiàn)在我們可(kě)以學習(xí)設計(Ω↑®jì)模式了(le)。
創建型設計(jì)模式:
有(yǒu)很(hěn)多(duō)種不(bù)同的(de)創建設計(>₩∑&jì)模式,但(dàn)是(shì)在這(zhè)裡(lǐ)我們主要(y×>≈ào)討(tǎo)論兩種,建造模式(Builder)和(hé)原型模ε∑↓式(Prototype)。
建造模式:
建造模式通(tōng)常用(yòng)于web開(kāi)發,有α>↑(yǒu)時(shí)你(nǐ)在使用(₽δyòng)它你(nǐ)卻還(hái)沒意識到γ£ (dào)。簡而言之,這(zhè)個(gè)模式可(kě)以定義如(rú)下(₽±xià):
“使用(yòng)建造模式允許我們僅僅通 ∑σ(tōng)過指定類型和(hé)內(nèi)容來(lái)構造一(yī)個(g₹ αè)對(duì)象,我們不(bù)需要(yào)明(míng)确的(de)創£€建對(duì)象。”
例如(rú),你(nǐ)可(kě)能(néφ₽ng)無數(shù)次的(de)使用(yòng)jQu∏'→ery:
varmyDiv=$(‘
//myDivnowrepresentsajQueryobje¥™×ctreferencingaDOMnode.
varsomeText=$(‘
’);//someTextisajQuer ↔≈yobjectreferencinganHTMLParagraph> Element
varinput=$(‘’);
看(kàn)看(kàn)上(shàng)面這(♦∏&σzhè)三個(gè)例子(zǐ),第一(yī)個(gè),傳遞了(le)一(•♣yī)個(gè)
元素附帶一(yī)些(xiē)內(nèi)容,第二個 ↑(gè),傳遞一(yī)個(gè)空(kōng)的(de)标簽,第三個(gè),傳遞一(yī)個(gè)元素。這(zhè)三個(gè)例子(zǐ)的(de)結果都(dōu)是∑₽¥®(shì)一(yī)樣的(de):返回一(yī)個(gè)jQueryδ✘✔對(duì)象的(de)引用(yòng)指向一(yī)₽γ個(gè)DOM節點。
在jQuery中$變量采用(yòng)的(de)就(jiù♥₩ε™)是(shì)建造模式,例如(rú):返回的(de)jQuery↓€§¶Dom對(duì)象可(kě)以訪問(wèn)由jQuery庫提供的(de)<₹所有(yǒu)方法,但(dàn)是(shì)并沒有(yǒu)顯示的≈π→(de)調用(yòng)document.createElement,JS庫通 ♣(tōng)常都(dōu)是(shì)通(tōng)過這(zhè)種高(gā✘§o)級方法處理(lǐ)的(de)。
想象有(yǒu)多(duō)少(shǎo)工(gōng↓ )作(zuò)要(yào)做(zuò),如(rú)果我們顯示創建D←↓™OM元素然後插入內(nèi)容到(dào)裡(lǐ)面。通(tōn&♥∏βg)過利用(yòng)建造模式,我們可(kě)以專注于Ω&¥對(duì)象的(de)類型和(hé)內€<(nèi)容,而不(bù)是(shì)顯示的(de)去(qù)創建。
原型模式
之前,我們討(tǎo)論了(le)在JaΩ↕φεvaScript中通(tōng)過函數(shù→γα)和(hé)添加方法到(dào)對(duì♠©δ)象的(de)原型中定義一(yī)個(gè)數(shùΩ♦)據類型。原型模式通(tōng)過原型允許對(duì)象繼承自(z ✘$ì)其它對(duì)象。
“原型模式是(shì)一(yī)個(gè)基于已經存在的≥€φ↑(de)模闆對(duì)象克隆出新對(duì)象λ的(de)模式”
在JavaScript中這(zhè)是(shì)一♦σ£♥(yī)種簡單自(zì)然的(de)方式來(lái)實現(xiàn)繼承。例如∞≠"(rú):
varPerson={
numFeet:2,
numHeads:1,
numHands:2
};
//Object.createtakesitsfirs♥₹↓targumentandappliesittotheprototypeof'★yournewobject.
vartilo=Object.create(Person);
console.log(tilo.♣☆numHeads);//outputs1
tilo.numHeads=2;
console.log(tilo.numHea εds)//outputs2
屬性(方法)在Person對(duì)象中應用(yòng)到(dà≠↑o)了(le)tilo對(duì)象的(de)原型,我們可↕γ(kě)以重新定義在tilo對(duì)象中的(' ®±de)屬性,如(rú)果我們想要(yào)它不(b"∏β×ù)一(yī)樣的(de)話(huà)。上(shàng☆★$)面例子(zǐ)中,我們使用(yòng)Object.create(),Ω然而,IE8中不(bù)支持這(zhè)個(gè)比較新的(de)方法♠"φ,在這(zhè)種情況下(xià),我們可(kě)以模拟他(tā)的(d→∑¥e)行(xíng)為(wèi):
varvehiclePrototyΩ©pe={
init:function(carModel){
this.model=carMod →> el;
},
getModel:function(){
console.log(“Themodelo§±¥✘fthisvehicleis”+this.model);
}
};
functionvehicle(model∏≠){
functionF(){};
F.prototype=vehiclePrototype;
varf=newF();
f.init(model);
returnf;
}
varcar=vehicle(&ldquπ∑o;FordEscort”);✔>
car.getModel();
唯一(yī)不(bù)好(hǎo)的(de)地(dì)方←σ 就(jiù)是(shì)這(zhè)個(gè)方法你(nǐ)沒§♦>法指定為(wèi)可(kě)讀(dú)的(₩Ωde)屬性,而使用(yòng)Object.create()時(s≥®hí)可(kě)以指定。不(bù)管怎樣,原型模式展示了★¶&(le)對(duì)象如(rú)何繼承自(zì)其它對(duì)象≤★∏£。
結構化(huà)模式:
結構化(huà)設計(jì)模式在當你(nǐ)想理(lǐ)解一(yī)★∞×€個(gè)系統如(rú)果工(gōng)作(zuò)的(de)時( ≤&shí)候顯得(de)非常有(yǒu)幫助。Ω'↓它能(néng)使應用(yòng)擴展方便,維護方便。我們将討(tǎo)論以下★εε←(xià)兩種模式:組合模式和(hé)門(mén)面模式
組合模式:
組合模式可(kě)以理(lǐ)解為(wèi)一(yī)∏♦γ個(gè)對(duì)象的(de)組合可(kě)以像單個(gè)對ε♣>™(duì)象一(yī)樣以一(yī)緻的(de$σ)方式處理(lǐ)。這(zhè)是(shì)什(shén)麽意思呢(ne) ™✘?好(hǎo)吧(ba),考慮下(xià)σδΩ面這(zhè)個(gè)例子(zǐ):
$(‘.myList’).addCla €ss(‘selected’);
$(‘#myItem&rsquΩγo;).addClass(‘selected&rsqu∑↑ §o;);
//dontdothisonlargetables,it&ls¶↓→'quo;sjustanexample.
$(“#dataTabletbo₹ε≠dytr”).on(“click”,fun ✘α¶ction(event){
alert($(this).text());
});
$(’#myButton‘).on(&l $₩©dquo;click”,funct↔≠↔ion(event){
alert(“Clicked.&φ↕rdquo;);
});
很(hěn)多(duō)JavaScript庫提♠♥>供了(le)一(yī)緻的(de)API,不(bù)論是(✔♣×shì)處理(lǐ)單個(gè)DOM元÷★÷∞素還(hái)是(shì)一(yī)個(gè)DOM元素的(de)數(shù★¥)組。我們可(kě)以添加selected類給所βαα✘有(yǒu)含.myList的(de)選擇α↔₩器(qì)的(de)元素。同樣我們可(kě)以"♣€使用(yòng)相(xiàng)同的(de)方法處理(lǐ)相(xiàngαελ≥)似的(de)DOM元素#myItem,類似∏π<ε的(de),我們可(kě)以使用(yòng)on()方法•↓ε♣附上(shàng)事(shì)件(jiàn)處理(lǐ)器(qì)在多(d↑ uō)個(gè)節點或單個(gè)節點上(sh♠¶àng)。
門(mén)面模式:
隐藏內(nèi)部複雜(zá)結構,提供給用(yòn♣§αg)戶簡單接口使用(yòng)。
門(mén)面模式幾乎總是(shì)可(kě)以改善∞↕大(dà)部分(fēn)軟件(jiàn)的(de)可(kě)用(yòng)®✘✔€性。使用(yòng)jQuery作(zuò)≈γ為(wèi)例子(zǐ),一(yī)個(gè)最受歡迎的•∑↕(de)方法ready():
$(document).ready(function()₹Ω£{
//allyourcodegoeshere...
});
ready()方法就(jiù)實現(xiàn)的σ&(de)門(mén)面模式,如(rú)果你↑₽(nǐ)去(qù)查看(kàn)源代碼,你(nǐ↓™₹)将發現(xiàn):
ready:(function(){¶λ₩
......
//Mozilla,Opera,andWe×'≥bkit
if(document.addEventListener){
document.addEventListener(&ldq<uo;DOMContentLoaded” ≈φ,idempotent_fn,false);
....
}
//IEeventmodel
elseif(document.a><≠¶ttachEvent){
//ensurefiringbeforeonl "oad;maybelatebutsafealsofor€₩±iframes
document.attachEvent(“onreadyΩβstatechange”,idempotent_fn);
//Afallbacktowindow.onloadπΩ<,thatwillalwayswork
window.attachEvent(“onload&rdq£γuo;,idempotent_fn);
...
}
})
ready()方法并不(bù)簡單,jQuery規₹↓÷範遊覽器(qì)的(de)一(yī)緻性确保ready()在合适♥★的(de)時(shí)間(jiān)被觸發。然而,作(zuò)為(wèi)一Ω"(yī)名開(kāi)發者,你(nǐ)應該用(yòng)簡單的(de)接口展示✔出來(lái)。
總結:設計(jì)模式最讓人(rén)鼓舞(w∞↔ǔ)的(de)是(shì)有(yǒu)人(rén)在過去(qù)已 γ經成功實踐了(le)。很(hěn)多(duō↕↑)開(kāi)源代碼實現(xiàn)了(le)各種JavaScript§®中的(de)是(shì)設計(jì)模式。作(zuò)為•→₹(wèi)程序員(yuán),我們需要(y≥×Ω↓ào)意識到(dào)每種設計(jì)模式的(♥®≈de)應用(yòng)場(chǎng)景。我希望這(zh↕•λδè)篇教程能(néng)幫助一(yī)步步回答(dá)這(zhè)些(xiē₩β)問(wèn)題。
- 歡迎大(dà)家(jiā)閱讀(dú)浏覽¶,部分(fēn)內(nèi)容來(lái)源于網絡,如(rú)有(yǒu)♣∑βα侵權,請(qǐng)聯系我們删除!
- 上(shàng)一(yī)條:小(xiǎo)函數(shù)越小(xiǎo)越有& (yǒu)優勢力
- 下(xià)一(yī)條:5.10日(rì)音(yīn)訊,滾動視(§☆shì)差知(zhī)識要(yào)學習(xí®↑)要(yào)點
服務項目
熱(rè)門(mén)信息
- 邯鄲網絡公司:模闆建站(zhàn)的(de)↔∑好(hǎo)處有(yǒu)哪些(xiē)?
- 3642024-04-25

- 4.9日(rì)訊,企業(yè)網站(zhàn)建設如(rú)何發揮網✘∏絡營銷功能(néng)?
- 4092024-04-09

- 邯鄲網絡公司:網站(zhàn)建設開(kāi)發有(yǒu)哪®↓些(xiē)細節需要(yào)注意?
- 5402024-03-07

- 邯鄲網絡公司:外(wài)貿網站(zhàn)制(zhì)作( zuò)的(de)8個(gè)步驟
- 3772024-03-05

- 簡單3步,輕松做(zuò)企業(yè)官網
- 6822024-02-18
