第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

js 多態(tài)如何理解,最好能有個(gè)例子

js 多態(tài)如何理解,最好能有個(gè)例子

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

2 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

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

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)