一段多態(tài)的javascript代碼—多態(tài)
《javascript設(shè)計模式與開發(fā)實踐》
定義:同一操作作用于不同的對象,可以產(chǎn)生不同的解釋和不同的操作結(jié)果
//動物的發(fā)生方法映砖,函數(shù)指定誰誰來發(fā)聲,誰就調(diào)用對應(yīng)的函數(shù)
var makeSound = function( animal ){
if ( animal instanceof Duck ){ //動態(tài)監(jiān)測傳入對象類別
console.log( '嘎嘎嘎' );
}else if ( animal instanceof Chicken ){ 動態(tài)監(jiān)測傳入對象類別內(nèi)
console.log( '咯咯咯' );
}
};
var Duck = function(){}; //獲得鴨子對象绪抛,不知道要干什么
var Chicken = function(){}; //獲得公雞對象询吴,不知道要干什么
makeSound( new Duck() ); // 這里就是指定鴨子誰去聲
makeSound( new Chicken() ); // 這里指定公雞去發(fā)聲
多態(tài)背后的思想就是將“誰去做”和“誰去做以及做什么分開” 把不變的部分隔離出來,把可變的部分封裝起來秋麸。給予我們程序的擴展能力嗜诀,程序看起來了是看增長的猾警。
上述程序的具體執(zhí)行代碼仍然是耦合在一起,需要進一步優(yōu)化裹虫。
首先把不變的部分隔離出來肿嘲,這里就是所用的動物都會發(fā)聲
var makeSound = function( animal ){ //所有的動物都會發(fā)聲
animal.sound(); //animal是抽象的,傳入誰筑公,就誰的方法
};
//可變部分各自封裝起來
var Duck = function(){};
Duck.prototype.sound = function(){
console.log( '嘎嘎嘎' ); //鴨子的多態(tài)方法
};
var Chicken = function(){};
Chicken.prototype.sound = function(){
console.log( '咯咯咯' ); //公雞的多態(tài)方法
};
makeSound( new Duck() ); // 嘎嘎嘎
makeSound( new Chicken() ); // 咯咯咯
//動物群里有好多種雳窟,大黃狗說我也要叫,于是就建立把,其他的動物都一樣
var Dog = function(){};
Dog.prototype.sound = function(){
console.log( '汪汪汪' ); //大黃狗的多態(tài)邏輯
};
makeSound( new Dog() ); // 汪汪汪
Javascript 作為動態(tài)性語言封救,變量類型在運行中是可以改變的拇涤。一個JS對象。既可以表示鴨子對象類型誉结,又可以表示公雞類型鹅士。
在makeSound函數(shù)中既可以傳遞duck對象,又可以傳遞chkicken對象惩坑。
多態(tài)最根本的作用就是通過對象的多態(tài)性把條件分支語句消除掉盅。
將行為分布在各個對象中,讓這些對象各自負責自己的行為以舒。