站長資訊網
最全最豐富的資訊網站

javascript中有沒有多態

JavaScript中有多態;多態表示的是同一操作作用于不同的對象上面可以產生不同的解釋和不同的執行結果,JavaScript中的多態體現在子類中可直接實現同名函數即可覆蓋父類函數,JavaScript中的父類函數都可以直接覆蓋。

javascript中有沒有多態

本教程操作環境:windows10系統、javascript1.8.5版、Dell G3電腦。

javascript中有多態

含義

同一操作作用于不同的對象上面,可以產生不同的解釋和不同的執行結果

比方說,我養了一只貓和一只狗,我對它們發出同一個指令 “叫一下”,貓會喵喵喵,而狗會汪汪汪,所以讓它們叫一下就是同一操作,而叫聲不同則是不同的執行結果。

用偽代碼來實現就是這樣的:

function getVoice(animals) {     if(animals instanceof Cat){         console.log('喵~');              }     if(animals instanceof Dog){         console.log('汪~');     } } class Cat {} class Dog {} getVoice(new Cat()); // '喵~' getVoice(new Dog()); // '汪~'

那么如果我們想增加一個動物呢?再多加一個判斷?那么之后我每次都想要加一個動物的叫聲就都要修改一次 getVoice?是不是有點繁瑣呢?

所以我們要想想如何解決這個問題~

對象的多態性

其實多態最根本的作用就是通過把過程化的條件語句轉化為對象的多態性,從而消除這些條件分支語句。

通俗一點來講,就是把 “做什么” 和 “誰去做以及怎么去做” 分離開,抽象概括就是把 “不變的事物” 和 “可能改變的事物” 分離開。

最開始我們舉的例子中就可以拆分理解成這樣:

不變的事物是:動物發出叫聲 可能改變的事物是:什么動物發出什么樣的叫聲

那我們就可以把 “動物發出叫聲” 這個動作分布到各個類上(封裝到各個類上),然后在發出叫聲的 getVoice 函數中調用"叫"這個動作就可以了。

上面這個例子就可以修改成這樣啦~

function getVoice (animals) {     if (animals.sound instanceof Function) {         // 判斷是否有animal.sound且該屬性為函數         animals.sound();     } } class Cat {     sound () {         console.log('喵~');     } } class Dog {     sound () {         console.log('汪~');     } } getVoice(new Cat()); // '喵~' getVoice(new Dog()); // '汪~'

多態的實際應用

多態在設計模式中應用得比較廣泛,比如 組合模式 / 策略模式等等。~~

雖然我們在平時的開發中不太用的到,但是一旦我們涉及到一些設計模式的話,多態還是很有用的

JS的封裝與多態

除了繼承,封裝與多態也是面向對象思想的組成部分。JS的封裝、多態也是通過屬性的靈活應用“模擬”實現的。

通過在類中設置公共屬性,并在子類中實現,就可以模擬封裝。

而多態的體現,則更為簡單,在子類中直接實現同名函數即可覆蓋(override)父類函數。JS中沒有類似C#中的virtualde 關鍵字,所有父類函數都可以直接覆蓋。

示例:

function calc(value1,value2){ this.data1=value1; this.data2=value2;  this.GetResult; this.toString=function(){ if(this.GetResult) return this.GetResult()+""; return "0"; } }   function sumCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){  return this.data1+this.data2; } } function productCalc(value1,value2){ calc.call(this,value1,value2) this.GetResult=function(){  return this.data1*this.data2; } } var s=new sumCalc(2,3); alert(s.toString());  //彈框5 var p=new productCalc(2,3); alert(p.toString());  //彈框6

如上,sumCalc類與productCalc類都繼承并實現了calc類,并實現了“抽象函數”GetResult()。這就是JS封裝的實現方式。

另外,JS中的所有類都繼承于Object,而Object有自己的toString()函數。所以,上面calc類的toString()函數實際上覆蓋了原有的函數—-多態的體現。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产亚洲午夜精品| 国产精品1024| 国产精品久久无码一区二区三区网| 免费视频成人国产精品网站| 99热精品久久只有精品30| 亚洲av日韩av天堂影片精品| 亚洲午夜精品久久久久久人妖| 亚洲日韩国产精品乱-久| 91热久久免费精品99| 一区二区三区四区精品| 国拍在线精品视频免费观看| 中文字幕日本精品一区二区三区| 精品69久久久久久99| 九九免费久久这里有精品23| 日韩精品在线播放| 日本精品www色| 国产成人精品一区二区三区无码 | 最新精品亚洲成a人在线观看| www国产亚洲精品久久久| 欧美日韩精品一区二区在线观看| 99精品众筹模特私拍在线| 亚洲中文久久精品无码| 精品国产日韩亚洲一区| 国产精品亚洲色图| 精品伊人久久大线蕉色首页| 国产午夜亚洲精品理论片不卡 | 四虎精品成人免费视频| 亚洲日韩精品无码专区加勒比☆| 精品久久8x国产免费观看| 精品无人区一区二区三区在线 | 国产美女精品人人做人人爽| 精品国产18久久久久久 | 国语自产少妇精品视频蜜桃| 亚洲欧美日韩中文字幕一区二区三区| 国产成人亚洲精品无码AV大片| 3d动漫精品成人一区二区三 | 99re这里只有精品国产精品| 中日韩精品电影推荐网站| 99re这里只有精品6| 国产在线精品免费aaa片| 国产成人精品高清在线观看93 |