JS進階系列03-JS面向?qū)ο蟮娜筇卣髦鄳B(tài)

1. 多態(tài)的定義

多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力兼贸。在JAVA中,多態(tài)通過在子類中重寫父類方法去實現(xiàn)坷牛。但是在JS中很澄,由于JS本身是動態(tài)的颜及,天生就支持多態(tài)。大家可以通過幾個例子來理解一下讯蒲。

2. 多態(tài)的實現(xiàn)

舉個例子吧肄扎,國王聽膩了只有鴨子為他唱歌,他決定搞一個動物合唱團犯祠。所以,大臣們搜羅了鴨搔耕,雞痰娱,狗等動物,而且還設置了專門的選拔官員測試鲸睛,選拔官員一聲令下:‘唱’坡贺,面前的動物就發(fā)出了特有的叫聲,鴨子嘎嘎嘎钧萍,小雞咯咯咯政鼠,小狗汪汪汪......要實現(xiàn)這個功能,我們可以使用如下代碼:

var singStart(animal){
    if (animal instanceof Duck) {
        console.log('嘎嘎嘎');
    } else if (animal instanceof Chicken) {
        console.log('咯咯咯');
    }
function Duck(){}
function Chicken(){}
singStart(new Duck());  // 嘎嘎嘎
singStart(new Chicken());  // 咯咯咯
}

這種方法當然也可以實現(xiàn)多態(tài)万搔,但是卻違反了封裝性,我們將可變的動物類型與不可變的唱歌指令耦合到了一起瞬雹。如果動物類型增加,我們必須在開始唱歌方法中新增判斷分支呢诬。這就好比是選拔官員發(fā)出的指令是這樣的:“你是鴨子的話胖缤,唱嘎嘎嘎哪廓,是雞的話狗唉,唱咯咯咯分俯,是狗的話缸剪,唱汪汪汪......”這明顯是不合理的。真實的情況應該是橄登,選拔官員發(fā)出簡短清晰的指令“唱”時讥此,每種動物會場出自己獨有的聲音。
讓我們用面向?qū)ο蟮乃枷肴タ紤]卒稳,將不變的指令隔離開來,將可變的具體實現(xiàn)封裝起來充坑。JAVA會使用類繼承和重寫的方式來實現(xiàn)染突,如下:

abstract class Animal {  
    abstract void sing();  
}  
  
class Duck extends Animal {  
    public void sing() {  
        System.out.println("嘎嘎嘎");  
    }  
}  
  
class Chicken extends Animal {  
    public void sing() {  
        System.out.println("咯咯咯");  
    }  
} 
public class Test {
    public static void main(String[] args) {
        Animal duck = new Duck();
        Animal chicken = new Chicken();
        singStart(duck);  // 嘎嘎嘎
        singStart(chicken);  // 咯咯咯
  }  
            
public static void singStart(Animal a)  {
      a.sing();
}

而對于JS來講份企,我們?yōu)榫唧w的動物類型的原型定義具體的sing方法即可,如下:

function Duck(){}
Duck.prototype.sing = function(){
    console.log('嘎嘎嘎');
}
function Chicken(){}
Chicken.protorype.sing = function(){
    console.log(‘咯咯咯’);
}
function singStart(animal){
    animal.sing();
}
singStart(new Duck());  // 嘎嘎嘎
singStart(new Chicken());  // 咯咯咯

而且司志,更棒的是,JS是動態(tài)的囚霸,這里并不限制傳入的參數(shù)類型是animal。大家可以看到额嘿,我們在代碼中吨述,也沒有實現(xiàn)Animal這個類型,事實上,我們可以傳入任意類型的對象冰啃,只要它正確包含一個sing方法即可阎毅。如下:

function Person(){}
Person.protorype.sing = function(){
    console.log(‘哈哈哈’);
}
singStart(new Person());  // 哈哈哈

可以看出來,在JS中實現(xiàn)多態(tài)更加方便扇调,且更加強大。

參考

BOOK-《JavaScript設計模式與開發(fā)實踐》 第一部分
Javascript基于對象三大特征
【原生js】js面向?qū)ο笕筇卣髦鄳B(tài)筆記
JAVA多態(tài)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市莲镣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瑞侮,老刑警劉巖鼓拧,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钮糖,死亡現(xiàn)場離奇詭異种玛,居然都是意外死亡瓤檐,警方通過查閱死者的電腦和手機娱节,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門肄满,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掰担,你說我怎么就攤上這事怒炸。” “怎么了阅羹?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵捏鱼,是天一觀的道長导梆。 經(jīng)常有香客問我,道長看尼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮灾茁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禀挫。我一直安慰自己拓颓,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布匿醒。 她就那樣靜靜地躺著缠导,像睡著了一般。 火紅的嫁衣襯著肌膚如雪僻造。 梳的紋絲不亂的頭發(fā)上髓削,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天立膛,我揣著相機與錄音揪罕,去河邊找鬼。 笑死旧巾,一個胖子當著我的面吹牛耸序,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲁猩,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罢坝!你這毒婦竟也來了廓握?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘁酿,失蹤者是張志新(化名)和其女友劉穎隙券,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闹司,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡娱仔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了游桩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牲迫。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陪每,靈堂內(nèi)的尸體忽然破棺而出檩禾,到底是詐尸還是另有隱情饵婆,我是刑警寧澤啦辐,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布紧卒,位于F島的核電站轴总,受9級特大地震影響怀樟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虑灰,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一对湃、第九天 我趴在偏房一處隱蔽的房頂上張望熟尉。 院中可真熱鬧剧包,春花似錦、人聲如沸堕油。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜀肘。三九已至扮宠,卻和暖如春涵卵,著一層夾襖步出監(jiān)牢的瞬間被廓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挎春,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顾腊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354