學(xué)習(xí)JavaScript設(shè)計模式——面向?qū)ο?五)

面向?qū)ο?五)

多態(tài)

我仔細看了一下,這里說的JavaScript 的多態(tài)好像和Java的多態(tài)不一樣,

  • Java 的多態(tài)講的是類的繼承,父類實例指向子類對象,父類方法的重寫
  • JavaScript的多態(tài)是一個方法多種調(diào)用方式

還是有一些不同, 上代碼

  // 多態(tài)
  function add() {
    // 獲取參數(shù)
    let arg = arguments
    // 獲取參數(shù)長度
    let len = arg.length
    switch(len) {
      // 如果沒有參數(shù)
      case 0:
         return 10;
      // 如果只有一個參數(shù)   
      case 1:
         return 10 + arg[0]
      // 如果有兩個參數(shù)
      case 2:
         return arg[0] + arg[1]      
    }
  }
  
  
  // 測試用例
  console.log(add())        // 10
  console.log(add(5))       // 15
  console.log(add(6, 7))    // 13

另一種更易懂的形式(更像面向?qū)ο蟮姆绞?

function Add(){
   // 無參數(shù)算法
   function zero() {
      return 10
   }
   // 一個參數(shù)的算法
   function one(num) {
      return 10+num
   }
   // 兩個參數(shù)的算法
   function two(num1, num2){
      return num1+num2
   }
   this.add = function() {
      let arg = arguments
      let len = arg.length
      
      switch(len) {
         case 0:
            return zero()
         case 1:
            return one(arg[0])
         case 2:
            return two(arg[0], arg[1])   
      }
   }
 }
 
 // 實例化類
 let A = new Add()
 // 測試
 console.log(A.add())      // 10
 console.log(A.add(5))     // 15
 console.log(A.add(6, 7))  // 13
 

總結(jié)一下(這里的能稍微看看就行)

在JavaScript中

封裝

  • 封裝與集成是面向?qū)ο笾械膬蓚€主要特性,繼承即是對原有對象的封裝,從中創(chuàng)建私有屬性,私有方法,特權(quán)方法,共有屬性,共有方法等。
  • 有的不論對類如何實例化,它只創(chuàng)建一次,這類屬性或方法我們稱之為靜態(tài)的
  • 只被類所擁有的屬性和方法是靜態(tài)類屬性和靜態(tài)類方法 (這段有點沒說清楚)
  • 可以被繼承的的方法與屬性 一類是在構(gòu)造函數(shù)中,這類屬性與方法在對象實例化時 被復(fù)制一遍
  • 另一類在類的原型對象中,這類屬性與方法在對象實例化時被所有實例化對象所共用

繼承

  • 如果實例化的是對象,那么則為對象繼承 (這個說法真飄逸= =)

  • 如果實例化的是類(當(dāng)然累也是一種對象,只不過是用來創(chuàng)建對象的), 那么就是一種類的繼承

  • 通過原型鏈繼承的方式我們稱之為類式繼承

  • 通過構(gòu)造函數(shù)繼承的方式我們稱之為構(gòu)造函數(shù)式繼承

  • 這兩種方式組合起來的方式我們稱之為組合式繼承

  • 由于類式繼承過程中會實例化父類,這樣如果父類構(gòu)造函數(shù)極其復(fù)雜,那么這種方式對構(gòu)造函數(shù)的開銷是不值得的,所以有了一種新的繼承方式,通過在一個函數(shù)內(nèi)的過度對象實現(xiàn)繼承并返回新對象的方式,我們稱之為寄生式繼承

  • 我們再結(jié)合構(gòu)造函數(shù)式繼承,這樣再融合構(gòu)造函數(shù)繼承中的有點并去除其缺點,得到的繼承方式就是 寄生組合式繼承,

  • 有時候子類對父類實現(xiàn)繼承可以通過拷貝方法與屬性的方式來實現(xiàn),這就有了多繼承,即將多個父類(對象)的屬性與方法拷貝給子類實現(xiàn)繼承

  • 這里的JavaScript的多態(tài),通過對傳遞參數(shù)判斷來決定執(zhí)行邏輯,可以實現(xiàn)一種多態(tài)處理機制(和Java不太一樣)

面向?qū)ο蠡A(chǔ)就暫時這樣了,后面就開始正式的面向?qū)ο蟮膶崙?zhàn)應(yīng)用,設(shè)計模式了...

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容