1. 程式人生 > >JS面向物件程式設計之:封裝、繼承、多型

JS面向物件程式設計之:封裝、繼承、多型

 

 

      一、封裝

      (1)封裝通俗的說,就是我有一些祕密不想讓人知道,就通過私有化變數和私有化方法,這樣外界就訪問不到了。然後如果你有一些很想讓大家知道的東西,你就可以通過this建立的屬性看作是物件共有屬性和物件共有方法,這樣別人知道你的公共的東西啦,不止如此,你還可以訪問到類或物件自身的私有屬性和私有方法。哇,這種權利好大呀,外面的公共的方法和屬性,和內部的私有屬性和方法都可以訪問到,都有特權啦,因此就叫做特權方法了。看個例子就知道啦。

類的內部this上定義的屬性和方法自然就可以複製到新建立的物件上,成為物件公有化的屬性和方法,又可以訪問私有屬性和私有方法,因此就叫特權方法。

這樣呼叫就可以啦

      (2)閉包實現的封裝

  閉包是有權訪問另外一個函式作用域中變數的函式,即在一個函式內部建立另外一個函式。這時就可以將閉包作為建立物件的建構函式,這樣它既是閉包又是可例項物件的函式。

       二、繼承

  (1)類

   每個類有3個部分:1,是建構函式內的,是供例項化物件複製用的。2,是建構函式外的,直接通過點語法新增的,這是供類使用的,例項化物件是訪問不到的。3,是類的原型中的,例項化物件可以通過其原型鏈簡介地訪問到,也是為供所有例項化物件所共有的。

     (2)類式繼承

     通過子類的原型prototype物件例項化來實現的

  

繼承就是宣告2個類,不過類式繼承需要將第一個類的例項賦值給第二個類的原型。這段程式碼,在實現subClass繼承superClass時是通過將superClass的例項賦值給subClass的原型prototype,所以subClass.prototype繼承了superClass.

缺點就是:一個子類的例項原型從父類建構函式中繼承來的共有屬性就會直接影響到其他子類。比如:

額外知識點:instanceof是通過物件的prototype鏈來確定這個物件是否是某個類的例項,而不關心物件與類的自身結構。

       (3)建構函式式繼承

       建構函式式繼承是通過在子類的建構函式作用環境中執行一次父類的建構函式來實現的。

     

SuperClass.call(this,id);是建構函式式繼承的精華,call可以更改函式的作用環境。這個對SuperClass呼叫這個方法就是將子類中的變數子啊父類中執行一遍,由於父類中是給this繫結屬性的,因此子類自然也就繼承了父類的共有屬性。由於這種型別的繼承沒有涉及原型prototype,所以父類的原型方法自然不會被子類繼承,而如果要想被子類繼承就必須要放在建構函式中。

  (4)組合繼承

    組合繼承就是:類式繼承+建構函式繼承

這裡用例子來測試下

 果然子類的例項中更改父類繼承下來的引用型別屬性如books,根本不會影響到其他例項,並且子類例項化過程中又能將引數傳遞到父類的建構函式中。

        (5)原型式繼承

         原型式繼承跟類式繼承一樣,父類物件book中的值型別的屬性被複制,引用型別的屬性被共有。

 

          (6)寄生式繼承

          通過在一個函式內的過渡物件實現繼承並返回新物件的方式,稱之為寄生式繼承。

         寄生就像寄生蟲一樣寄託於某個物件內部生長。就是對原型繼承的第二次封裝,並且在這第二次封裝過程中對繼承的物件進行了擴充套件,這樣新建立的物件不僅僅有父類中的屬性和方法而且還添加了新的屬性和方法。

看下下面的例子吧

             (7)寄生組合式繼承

          寄生組合式繼承就是寄生式繼承+建構函式式繼承,

先建立了父類,還有父類的原型方法,然後建立子類,並在建構函式中實現建構函式式繼承,然後又通過寄生式繼承了父類 原型,最後又對子類添加了一些原型方法。

現在我們來測試一下

顯然不會出現子類呼叫之後,另一個子類的值被改變。在這裡其中最大的改變是對子類原型的處理,被賦予父類原型的一個引用,這是一個物件。

         (8)多繼承

  

          通過這種方式對一個物件屬性的複製繼承,將多個父類(物件)的屬性與方法拷貝給子類實現繼承

           三、多型

          多型就是通過對傳遞的引數判斷來執行邏輯,即可實現一種多型處理機制

           下面就是這個例子,通過多型類,呼叫add運算方式,根據不同引數做運算

原文地址

這就是面向物件的三種特性啦,封裝、繼承、多型,對原理的理解,能在看其他人的優秀程式碼的時候,有個很好的理解。