亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js 多態如何理解,最好能有個例子

js 多態如何理解,最好能有個例子

九州編程 2019-04-13 08:36:55
最近讀到一本書《JavaScript設計模式與開發實踐》上,講到js的多態,我在JavaScript高級程序編程里貌似都沒有見過關于這個的詳細講解,所以想問問大家有沒有什么推薦的文章或者博客,可以推薦給小弟的,讓小弟可以深入了解一下。先把那本上的例子拿出來跟大家分享:書里面的故事:本人家里養了一只雞,一只鴨。當主人向他們發出‘叫’的命令時。鴨子會嘎嘎的叫,而雞會咯咯的叫。轉化成代碼形式如下非多態代碼示例varmakeSound=function(animal){if(animalinstanceofDuck){console.log('嘎嘎嘎');}elseif(animalinstanceofChicken){console.log('咯咯咯');}}varDuck=function(){}varChiken=function(){};makeSound(newChicken());makeSound(newDuck());多態的代碼示例varmakeSound=function(animal){animal.sound();}varDuck=function(){}Duck.prototype.sound=function(){console.log('嘎嘎嘎')}varChiken=function(){};Chiken.prototype.sound=function(){console.log('咯咯咯')}makeSound(newChicken());makeSound(newDuck());多態背后的思想是將”做什么“和”誰去做以及怎樣去做分開“。
查看完整描述

2 回答

?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

同一個實現接口,使用不同的實例而執行不同的操作。比如:打印機可以看作是父類,黑白打印機、彩色打印機是他的兩個子類。父類打印機中的方法“打印”在每個子類中有各自不同的實現方式,比如對黑白打印機執行打印操作后,打印效果是黑白的,而對彩色打印機進行打印操作后,打印效果是彩色的。
                            
查看完整回答
反對 回復 2019-04-13
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

到底什么是多態?這本身就是一個抽象的概念。寬泛的,你可以這么理解:
同一操作作用于不同的對象,可以有不同的解釋,產生不同的執行結果。換句話說,給不同的對象發送同一個消息的時候,這些對象會根據這個消息分別給出不同的反饋。(某某百科)本質上也就如題主說描述的“將‘做什么’和‘誰去做以及怎樣去做’分開”,歸根結底就是先消除不同對象的耦合關系。
舉個讓對象表示出多態性的最常用的例子說明一下:
//使用es6class簡化代碼
classParent{
sayName(){
console.log('Parent');
}
}
classChildextendsParent{
sayName(){
console.log('Child');
}
}
varchild=newChild();
child.sayName();//'Child'
varparent=newParent();
parent.sayName();//'Parent'
上面代碼中,我想要child對象和parent對象分別調用告訴我他們的名字(name),他們分別調用告訴我名字的方法(sayName)卻得到了不同的結果。盡管這實際上是在子類對象原型上創建了與父類對象原型同名的屬性和方法。但這就是一個多態。
多態分為編譯時多態和運行時多態。其中編輯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的函數,通過編輯之后會變成兩個不同的函數,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是我們所說的多態性。
由于JavaScript并不存在方法重載,并且在繼承方面也與傳統的接口/類不同,所以在JavaScript中大多是通過子類重寫父類方法的方式實現多態,就像上面這段代碼一樣,但是也可以通過一些別的方式來實現多態,畢竟這只是一種思想或者說是模式,比如包括但不僅限于這種方法:
//以下代碼基于上述代碼
functionsayAge(object){
if(objectinstanceofChild){
console.log('10');
}elseif(objectinstanceofParent){
console.log('30');
}
}
sayAge(child);//'10'
sayAge(parent);//'30'
不使用重寫,通過if/else的判斷,我們也得到了一個多態的實現:我想讓他們告訴我他們的年齡(age),他們調用讓我得到年齡的方法(sayAge)分別得到了不同的結果,這也是一個多態。只是這個多態具有較差的可擴展性而已,當然你可以改寫sayAge,以獲得更高的可擴展性:
functionsayAge(object){
object.prototype.sayAge();
}
當改寫成這樣,你沒發現這實際上就是在一個對象原型上創建了與另一個對象原型同名的屬性和方法嗎?
其實這種偏向設計模式的東西已經超出我這個渣渣的能力范圍,這不是看一本書做一道題就能解決的,等有新的想法了我再來補充。思考的方式可能存在問題,還請批評指正。
                            
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 437 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號