av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

理解JavaScript中的設計模式

簡介:可靠的設計模式是可維護軟件的基石,如果你曾參與技術面試,很有可能被問到關于設計模式的這類東西。下面這個指南中,我們將學習一些今天就可以用得著的設計模式。

在下冶等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站制作、網(wǎng)站建設 網(wǎng)站設計制作定制網(wǎng)站建設,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,成都全網(wǎng)營銷,成都外貿(mào)網(wǎng)站建設,下冶網(wǎng)站建設費用合理。

什么是設計模式?

簡單來說,設計模式就是對特定類型問題重用的軟件解決方案,這些問題在軟件開發(fā)的時候經(jīng)常會碰到,通過很多年的實踐,專家對一些相似地問題總結(jié)出一些方法,這些方法就封裝成為一種設計模式,所以:

模式是一種經(jīng)驗證的用于解決軟件開發(fā)問題的方案。

模式是可擴展的,因為他們經(jīng)常被結(jié)構(gòu)化而且你需要遵循某些規(guī)則。

對于相似的問題,模式可被重用

在接下來的教程中,我們將直接給出一些設計模式的例子。

設計模式的種類

軟件開發(fā)中,設計模式通常分為幾種類別,在這篇教程中我們重點介紹以下三種:

1、創(chuàng)建型模式專注于構(gòu)建對象或者類,對象的創(chuàng)建聽起來很簡單(在某些情況下),但是大型應用需要控制對象的創(chuàng)建過程。

2、結(jié)構(gòu)型設計模式專注于管理對象之間的關系使得應用是用一種可擴展的架,,結(jié)構(gòu)型模式關鍵點是確保在應用程序中部分改變不會影響其他部分。

3、行為模式專注于對象間的通信

你可能在讀完這些簡介的描述后仍然覺得有問題,這很正常,一旦我們看完了這些模式的深入介紹后,問題也會變得明朗起來,所以接著往下看吧。

類在JavaScript中的注意點:

當我們讀設計模式時,你經(jīng)常會提及到類和對象。這很疑惑,因為JavaScript沒有真正“類”的構(gòu)造,一個更合適的術語叫“數(shù)據(jù)類型”。

JavaScript中的數(shù)據(jù)類型:

JavaScript是一門面向?qū)ο蟮恼Z言,一個對象繼承自其他對象,這個概念以原型繼承著稱。一個數(shù)據(jù)類型可以通過構(gòu)造函數(shù)創(chuàng)建,就像:

 
 
 
  1. function Person(config) {
  2.     this.name = config.name;
  3.     this.age = config.age;
  4.  
  5. Person.prototype.getAge = function() {
  6.     return this.age;
  7. }; 
  8.  
  9. var tilo = new Person({name:"Tilo", age:23 });
  10. console.log(tilo.getAge());

當方法定義在Person數(shù)據(jù)類型中時注意prototype的使用,由于多個Person對象將引用同一個prototype,這樣就允許 getAge()方法可以被所有的Person數(shù)據(jù)類型的實例共享。而不是每個實例都重新定義一次,除此之外,任何繼承自Person的數(shù)據(jù)類型都可以訪問getAge()方法。

#p#

處理私有數(shù)據(jù)

在JavaScript中另一個常見的問題是沒有真正意義上的私有變量,然而我們可以使用閉包

去模擬私有變量,考慮下面這代碼片段:

 
 
 
  1. var retinaMacbook = (function() { 
  2.  
  3.     //Private variables
  4.     var RAM, addRAM; 
  5.  
  6.     RAM = 4; 
  7.  
  8.     //Private method
  9.     addRAM = function (additionalRAM) {
  10.         RAM += additionalRAM;
  11.     }; 
  12.  
  13.     return { 
  14.  
  15.         //Public variables and methods
  16.         USB: undefined,
  17.         insertUSB: function (device) {
  18.             this.USB = device;
  19.         }, 
  20.  
  21.         removeUSB: function () {
  22.             var device = this.USB;
  23.             this.USB = undefined;
  24.             return device;
  25.         }
  26.     };
  27. })();

在上面這個例子中,我們創(chuàng)建了一個retinaMacbook對象,含有公有和私有變量及方法,可以這樣來使用它:

 
 
 
  1. retinaMacbook.insertUSB("myUSB");
  2. console.log(retinaMacbook.USB); //logs out "myUSB"
  3. console.log(retinaMacbook.RAM) //logs out undefined

在JavaScript中函數(shù)和閉包可以做更多的事,但是我們在這個教程中沒法涉及到方方面面,我們簡短的學習了JavaScript的數(shù)據(jù)類型和私有變量?,F(xiàn)在我們可以學習設計模式了。

創(chuàng)建型設計模式:

有很多種不同的創(chuàng)建設計模式,但是在這里我們主要討論兩種,建造模式(Builder)和原型模式(Prototype)。

建造模式:

建造模式通常用于web開發(fā),有時你在使用它你卻還沒意識到。簡而言之,這個模式可以定義如下:

“使用建造模式允許我們僅僅通過指定類型和內(nèi)容來構(gòu)造一個對象,我們不需要明確的創(chuàng)建對象。”

例如,你可能無數(shù)次的使用jQuery:

 
 
 
  1. var myDiv = $('This is a div.
'); 
  •  
  • //myDiv now represents a jQuery object referencing a DOM node. 
  •  
  • var someText = $('

    ');

  • //someText is a jQuery object referencing an HTMLParagraphElement 
  •  
  • var input = $('');
  • 看看上面這三個例子,第一個,傳遞了一個

    元素附帶一些內(nèi)容,第二個,傳遞一個空的

    標簽,第三個,傳遞一個元素。這三個例子的結(jié)果都是一樣的:返回一個jQuery對象的引用指向一個DOM節(jié)點。

    在jQuery中$變量采用的就是建造模式,例如:返回的jQuery Dom對象可以訪問由jQuery庫提供的所有方法,但是并沒有顯示的調(diào)用document.createElement,JS 庫通常都是通過這種高級方法處理的。

    想象有多少工作要做,如果我們顯示創(chuàng)建DOM元素然后插入內(nèi)容到里面。通過利用建造模式,我們可以專注于對象的類型和內(nèi)容,而不是顯示的去創(chuàng)建。

    #p#

    原型模式

    之前,我們討論了在JavaScript中通過函數(shù)和添加方法到對象的原型中定義一個數(shù)據(jù)類型。原型模式通過原型允許對象繼承自其它對象。

    “原型模式是一個基于已經(jīng)存在的模板對象克隆出新對象的模式”

    在JavaScript中這是一種簡單自然的方式來實現(xiàn)繼承。例如:

     
     
     
    1. var Person = {
    2.     numFeet: 2,
    3.     numHeads: 1,
    4.     numHands:2
    5. }; 
    6.  
    7. //Object.create takes its first argument and applies it to the prototype of your new object.
    8. var tilo = Object.create(Person); 
    9.  
    10. console.log(tilo.numHeads); //outputs 1
    11. tilo.numHeads = 2;
    12. console.log(tilo.numHeads) //outputs 2

    屬性(方法)在Person對象中應用到了tilo對象的原型,我們可以重新定義在tilo對象中的屬性,如果我們想要它不一樣的話。上面例子中,我們使用Object.create(),然而,IE8中不支持這個比較新的方法,在這種情況下,我們可以模擬他的行為:

     
     
     
    1. var vehiclePrototype = { 
    2.  
    3.   init: function (carModel) {
    4.     this.model = carModel;
    5.   }, 
    6.  
    7.   getModel: function () {
    8.     console.log( "The model of this vehicle is " + this.model);
    9.   }
    10. }; 
    11.  
    12. function vehicle (model) { 
    13.  
    14.   function F() {};
    15.   F.prototype = vehiclePrototype; 
    16.  
    17.   var f = new F(); 
    18.  
    19.   f.init(model);
    20.   return f; 
    21.  
    22.  
    23. var car = vehicle("Ford Escort");
    24. car.getModel();

    唯一不好的地方就是這個方法你沒法指定為可讀的屬性,而使用Object.create()時可以指定。不管怎樣,原型模式展示了對象如何繼承自其它對象。

    結(jié)構(gòu)化模式:

    結(jié)構(gòu)化設計模式在當你想理解一個系統(tǒng)如果工作的時候顯得非常有幫助。它能使應用擴展方便,維護方便。我們將討論以下兩種模式:組合模式和門面模式

    組合模式:

    組合模式可以理解為一個對象的組合可以像單個對象一樣以一致的方式處理。這是什么意思呢?好吧,考慮下面這個例子:

     
     
     
    1. $('.myList').addClass('selected');
    2. $('#myItem').addClass('selected'); 
    3.  
    4. //dont do this on large tables, it's just an example.
    5. $("#dataTable tbody tr").on("click", function(event){
    6.     alert($(this).text());
    7. }); 
    8.  
    9. $('#myButton').on("click", function(event) {
    10.     alert("Clicked.");
    11. });

    很多JavaScript庫提供了一致的API,不論是處理單個DOM元素還是一個DOM元素的數(shù)組。我們可以添加selected 類給所有含.myList的選擇器的元素。同樣我們可以使用相同的方法處理相似的DOM元素#myItem,類似的,我們可以使用on()方法附上事件處理器在多個節(jié)點或單個節(jié)點上。

    #p#

    門面模式:

    隱藏內(nèi)部復雜結(jié)構(gòu),提供給用戶簡單接口使用。

    門面模式幾乎總是可以改善大部分軟件的可用性。使用jQuery作為例子,一個最受歡迎的方法ready():

     
     
     
    1. $(document).ready(function() { 
    2.  
    3.     //all your code goes here... 
    4.  
    5. });

    ready()方法就實現(xiàn)的門面模式,如果你去查看源代碼,你將發(fā)現(xiàn):

     
     
     
    1. ready: (function() { 
    2.  
    3.     ... 
    4.  
    5.     //Mozilla, Opera, and Webkit
    6.     if (document.addEventListener) {
    7.         document.addEventListener("DOMContentLoaded", idempotent_fn, false);
    8.         ...
    9.     }
    10.     //IE event model
    11.     else if (document.attachEvent) { 
    12.  
    13.         // ensure firing before onload; maybe late but safe also for iframes
    14.         document.attachEvent("onreadystatechange", idempotent_fn); 
    15.  
    16.         // A fallback to window.onload, that will always work
    17.         window.attachEvent("onload", idempotent_fn); 
    18.  
    19.         ...
    20.     } 
    21.  
    22. })

    ready()方法并不簡單,jQuery規(guī)范游覽器的一致性確保ready()在合適的時間被觸發(fā)。然而,作為一名開發(fā)者,你應該用簡單的接口展示出來。

    總結(jié):設計模式最讓人鼓舞的是有人在過去已經(jīng)成功實踐了。很多開源代碼實現(xiàn)了各種JavaScript中的是設計模式。作為程序員,我們需要意識到每種設計模式的應用場景。我希望這篇教程能幫助一步步回答這些問題。

    英文原文:Tilo Mitra

    譯文鏈接:http://blog.jobbole.com/25537/


    當前標題:理解JavaScript中的設計模式
    網(wǎng)站URL:http://uogjgqi.cn/article/coiijsg.html
    掃二維碼與項目經(jīng)理溝通

    我們在微信上24小時期待你的聲音

    解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流