久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      javascript中有沒有多態(tài)

      JavaScript中有多態(tài);多態(tài)表示的是同一操作作用于不同的對象上面可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果,JavaScript中的多態(tài)體現(xiàn)在子類中可直接實現(xiàn)同名函數(shù)即可覆蓋父類函數(shù),JavaScript中的父類函數(shù)都可以直接覆蓋。

      javascript中有沒有多態(tài)

      本教程操作環(huán)境:windows10系統(tǒng)、javascript1.8.5版、Dell G3電腦。

      javascript中有多態(tài)

      含義

      同一操作作用于不同的對象上面,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果

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

      用偽代碼來實現(xiàn)就是這樣的:

      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?是不是有點(diǎn)繁瑣呢?

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

      對象的多態(tài)性

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

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

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

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

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

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

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

      多態(tài)的實際應(yīng)用

      多態(tài)在設(shè)計模式中應(yīng)用得比較廣泛,比如 組合模式 / 策略模式等等?!?/p>

      雖然我們在平時的開發(fā)中不太用的到,但是一旦我們涉及到一些設(shè)計模式的話,多態(tài)還是很有用的

      JS的封裝與多態(tài)

      除了繼承,封裝與多態(tài)也是面向?qū)ο笏枷氲慕M成部分。JS的封裝、多態(tài)也是通過屬性的靈活應(yīng)用“模擬”實現(xiàn)的。

      通過在類中設(shè)置公共屬性,并在子類中實現(xiàn),就可以模擬封裝。

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

      示例:

      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類都繼承并實現(xiàn)了calc類,并實現(xiàn)了“抽象函數(shù)”GetResult()。這就是JS封裝的實現(xiàn)方式。

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

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號