JavaScript設計模式與開發(fā)實踐

第一部分 基礎知識

第一章 面向對象的Javascript

JavaScript 通過原型委托的方式來實現對象與對象之間的繼承赃承。在語言層也沒有提供對抽象類和接口的支持痒谴。

1.1 動態(tài)類型語言和鴨子類型

靜態(tài)類型語言在編譯時便確定變量的類型,動態(tài)類語言的變量類型要到程序運行時箱叁,待變量被賦予某個值后墅垮,才會具有某種類型。
JavaScript是一門動態(tài)類型語言耕漱。

動態(tài)類型語言對變量的寬容給實際編碼帶來了很大的靈活性算色。由于無需進行類型檢測,我們可以嘗試調用任何對象的任意方法螟够,而無需去考慮它原本是否被設計為擁有該方法灾梦。

這一切都是建立在鴨子類型(duck typing)的概念上。鴨子類型的通俗說法是:如果它走起來像鴨子齐鲤,叫起來也是鴨子斥废,那么它就是鴨子。

模擬鴨子故事的代碼

var duck = {
    duckSinging: function(){
            console.log('gagaga');
     }
};
var chicken = {
    duckSinging:  function(){
            console.log('gagaga');
    }
};
var choir = [ ]; //合唱團
var joinChoir = function ( animal ){
    if( animal && typeof animal.duckSinging === 'function'){
          choir.push(animal);
          console.log('恭喜加入合唱團');
          console.log('合唱團已有成員數量:' + choir.length);
  }
};
joinChoir( duck ); //恭喜加入合唱團
joinChoir( chicken ); //恭喜加入合唱團

對于加入合唱團的動物给郊,大臣們無需檢查它的類型牡肉,只需要保證他們擁有duckSinging方法即可。

1.2多態(tài)(polymorphism) 復數的形態(tài)

含義:同一操作作用于不同的對象上面淆九,可以產生不同的解釋和不同的執(zhí)行結果统锤。意思是,給不同的對象發(fā)送同一個消息的時候炭庙,這些對象會根據這個消息分別給出不同的反饋

1.2.1 一段“多態(tài)”的JavaScript代碼

var makeSound = function( animal ){
    if( animal instanceof  Duck ){
          console.log('gagaga');
    }else if ( animal instanceof Chicken ){
          console.log('lololo');
    }
};
var Duck = function(){};
var Chicken = function(){};

makeSound ( new Duck ); //gagaga
makeSound ( new Chicken ); //lololo

這段代碼如果要增加狗饲窿,則要改動makeSound函數,當動物越來越多焕蹄,makeSound有可能變成一個巨大的函數

1.2.2 對象的多態(tài)性

下面是改寫后的代碼逾雄,首先我們把不變的部分隔離出來,那就是所有的動物都會發(fā)出聲音:

var makeSound =function ( animal ){
    animal.sound();
};

然后把可變的 部分各自封裝起來腻脏,我們剛才談到的多態(tài)性實際上指的是對象的多態(tài)性:

var Duck = function (){}
Duck.prototype.sound =function(){
    console.log('gagaga');
};
var Chicken =function(){}
Chicken.prototype.sound=function(){
    console.log('lololo');
};
makeSound( new Duck() ); //gagaga
makeSound( new Chicken ); //lololo

加一個狗的叫只需加一段代碼鸦泳,而不需要改動以前的makeSound函數

var Dog =function(){}
Dog.prototype.sound=function(){
    console.log('wnwnwn');
};
makeSound( new Dog() ) //wnwnwn

1.2.3 類型檢查和多態(tài)

JavaScript是一門不必進行類型檢查的動態(tài)類型語言。
作者舉的java實例看不懂永品。

1.2.4 使用繼承得到多態(tài)效果

作者舉的java實例看不懂做鹰。

1.2.5JavaScript的多態(tài)

多態(tài)的思想實際上是把“做什么”和“誰去做”分離開,要實現這一點鼎姐,歸根結底先要消除類型之間的耦合關系钾麸。如果類型之間的耦合關系沒有被消除更振,那么我們在makeSound方法中指定了發(fā)出叫聲的對象是某個類型,它就不能被替換為另一個類型饭尝。在Java中肯腕,可以通過向上轉型來實現多態(tài)。而在JavaScript中則不需要芋肠。

1.2.6 多態(tài)在面向對象程序設計中的作用

在電影的拍攝現場乎芳,當導演喊出“action”時,主角開始背臺詞帖池,照明師負責打燈光,后面的群眾演員假裝中槍倒地吭净,道具師往鏡頭里撒上雪花睡汹。在得到同一個消息時,每個對象都知道自己應該做什么寂殉。如果不利用對象的多態(tài)性囚巴,而是用面向過程的方式來編寫這一段代碼,那么相當于在電影開始拍攝之后友扰,導演每次都要走到每個人的面前彤叉,確認它們的職業(yè)分工(類型),然后告訴他們要做什么村怪。如果映射到程序中秽浇,那么程序中將充斥著條件分支語句。

利用對象的多態(tài)性甚负,導演在發(fā)布消息時柬焕,就不必考慮各個對象接到消息后應該做什么。對象應該做什么并不是臨時決定的梭域,而是已經事先約定和排練完畢的斑举。每個對象應該做什么,已經成為了該對象的一個方法病涨,被安裝在對象的內部富玷,每個對象負責它們自己的行為。所以這些對象可以根據同一個消息既穆,有條不紊地分別進行各自的工作赎懦。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市循衰,隨后出現的幾起案子铲敛,更是在濱河造成了極大的恐慌,老刑警劉巖会钝,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伐蒋,死亡現場離奇詭異工三,居然都是意外死亡,警方通過查閱死者的電腦和手機先鱼,發(fā)現死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焙畔,“玉大人掸读,你說我怎么就攤上這事『甓啵” “怎么了儿惫?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伸但。 經常有香客問我肾请,道長,這世上最難降的妖魔是什么更胖? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任铛铁,我火速辦了婚禮,結果婚禮上却妨,老公的妹妹穿的比我還像新娘饵逐。我一直安慰自己,他們只是感情好彪标,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布倍权。 她就那樣靜靜地躺著,像睡著了一般捐下。 火紅的嫁衣襯著肌膚如雪账锹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天坷襟,我揣著相機與錄音奸柬,去河邊找鬼。 笑死婴程,一個胖子當著我的面吹牛廓奕,可吹牛的內容都是我干的。 我是一名探鬼主播档叔,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼桌粉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了衙四?” 一聲冷哼從身側響起铃肯,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传蹈,沒想到半個月后押逼,有當地人在樹林里發(fā)現了一具尸體步藕,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年挑格,在試婚紗的時候發(fā)現自己被綠了咙冗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡雾消,死狀恐怖,靈堂內的尸體忽然破棺而出挫望,到底是詐尸還是另有隱情,我是刑警寧澤媳板,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拷肌,受9級特大地震影響,放射性物質發(fā)生泄漏巨缘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一采呐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斧吐,春花似錦又固、人聲如沸煤率。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昼捍,卻和暖如春识虚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妒茬。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工担锤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍钻。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓肛循,卻偏偏與公主長得像铭腕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子育拨,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容