新聞資訊
記錄首創點滴進步 見(jiàn)證遠(yuǎn)行(x₹‌♠íng)
我們一(yī)直緊跟時(shí)代前沿,聚焦行(xíng)業(yè)≥ 實時(shí)動态,發布公司最新資訊,歡迎您的(de)關注

不(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=$(‘Thisisap.

’);

  //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)聯系我們删除!

+ 查看(kàn)更多(duō)我們的(de)客戶 / Our client

    24小(xiǎo)時(shí)技(jì)術(shù)支持♠₽×
    18931045623
    在線客服

首創簡介

    首創網絡成立于2012年(nián),是(sh←₹ì)一(yī)家(jiā)專業(yè)的(de)品牌網站(zhàn)&"α®設計(jì)和(hé)網絡營銷推廣公司,服務∑₩Ω領域涵蓋網站(zhàn)設計(jì)、市(shì)場(chǎn♠π✔₹g)策劃、企業(yè)畫(huà)冊及VI視(shì)∏&>覺設計(jì)、網站(zhàn)域名空(kōng)間(jiān)等領域,×​®公司擁有(yǒu)一(yī)批高(gāo)素質人(rén)才,著(zhe)•♦¶€力打造品牌網站(zhàn)設計(jì)制(zhì)作(zuò)≥'↓§和(hé)網上(shàng)營銷策略執行(xíng)兩大(dà)優勢。

    十年(nián)來(lái),憑借對(duì)₩σ市(shì)場(chǎng)趨勢敏銳的(de)洞察,和(hé)對(duì)消σ₹費(fèi)者、企業(yè)形态深刻的(de)理(lǐ)解Ωσ×,我們服務的(de)已遍及京津冀、長(c↕™£háng)三角、珠三角等領域,行(xíng)業(yè)覆蓋政府機♦ ★(jī)構、企事(shì)業(yè)單位、無線通(tō↕ •ng)訊、環保、電(diàn)子(zǐ)、醫(λβyī)藥、交通(tōng)、園林(lín)、地(₽π↑♥dì)産等行(xíng)業(yè),諸多(duō)知(zhī)名企業×γ(yè),如(rú)廣州京信集團、廣東(dōng)聯通(€•tōng)廣州分(fēn)公司、搜狐家(jiā)居廣州站(zhàn) >、搜狐家(jiā)居邯鄲站(zhàn)等,都(dōu)>ασ♠鑒證了(le)首創設計(jì)公司的(de)品牌設計± (jì)思想與能(néng)力,首創設計(jì)公司也(yě)與諸多(duō)• ↕企業(yè)勃的(de)市(shì)場(chα←∑ǎng)經濟中互促共生(shēng)。

在線客服


  • 掃描加微(wēi)信

  • 掃描加QQ

  • 掃描浏覽手機(jī)版
首創網絡邯鄲公司
邯鄲公司
服務熱(rè)線:0310-4559740♦★ / 18931045623  公司地(dì)址:邯鄲市(shì)叢台區(qū✘')頤高(gāo)廣場(chǎng)B座13層1304室  客戶接待☆÷≈:邯鄲市(shì)陵園路(lù)669号康橋國(guó)際B06≤€π