iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 20
0
自我挑戰組

學JS的心路歷程系列 第 20

學JS的心路歷程 Day20-JS 支援物件導向?(一)

昨天在看 Prototype 看到 JS 支援物件導向,被前輩問到說那什麼是物件導向? JS 是物件導向語言嗎?
便開始了一連串艱辛爬文過程,今天就來看一下兩者有什麼差異吧!

首先物件導向有三大特色,封裝、繼承及多型,這三個都是抽象的概念。

其中繼承這個抽象的概念,是為了避免多個類別間重複定義了相同行為與實作。基本上有兩種實作的方式可以實現,「原型繼承」與「類別繼承」。

這兩者分別的特色如下。

類別繼承 classical inheritance :

  • 可以從同一個 類別(class) 中 實例多個物件。

  • 可以將類別 組織成層次結構,進而重覆使用程式碼。

  • 常用的程式碼 (More general code) 將會儲存在 高階的類別,由低階的類別繼承。
    什麼是常用的程式碼?舉例來說,如果今天有兩隻不同品種的狗,但是叫聲都是一樣的,那我們便會把叫聲儲存在高階的類別:

    public class dog {
        public String voice = "wong!";
    }
    public class GoldenRetriever extends dog {
        public String color = "gold";
    }
    
  • 意味者物件與其它物件共享相同類別及父類別。

  • 建立物件的時候,會需要先寫出一個物件的類別(Class),然後,才利用這個類別來建立包含資料的物件,物件受限於類別而無法即時新增屬性和方法。

  • Java 或 C++ 的繼承是在定義類別時指定要繼承的類別來當作父類別 (SuperClass)

原型繼承 prototypal inheritance

  • 物件直接繼承其他物件,沒有所謂的類別,需要物件就直接寫一個。

  • 物件利用層級結構連結在一起,所以仍然可以重複使用。

  • 每個物件都跟創建它的物件有秘密連結,這形成一個鏈。

  • 物件被呼叫自己沒有的屬性時,它的父層將被呼叫,不斷往上找直到找到或到達根物件為止。

  • 繼承是經由指定物件的 Prototype 物件來達成的。

  • 可以在建立後的任何時間,透過 Prototype 屬性來指定要繼承的物件

  • 只要被繼承的物件新增屬性或方法,繼承的物件也可以馬上使用這些新增的屬性和方法

  • 方法和屬性可以動態新增,因此,彈性會比需要定義類別式的語言來得大,但是,相對的,程式結構就比較不嚴謹,也比較容易發生執行時期的錯誤 !

所以在 JS 中的每個函式(他們都是物件),實際上都有一個 prototype 的成員,負責在被呼叫物件時提供。
擁有這個成員允許了建構式的運作。

將屬性新增至函式物件的 prototype 可使它被使用於建構式的物件,以及從這建構式繼承的物件。
JS 的原型繼承是繼承這個抽象概念的實現方式的一種。

以上就是關於兩種繼承的比較,如果有錯誤及來源為附上歡迎留言指正,那麼我們明天見!

參考資料:
What does it mean that Javascript is a prototype based language?
wiki-物件導向
MDN-物件導向的細節
Javascript面面觀:核心篇《物件導向》
HabaCo/多型、覆寫、多載


上一篇
學JS的心路歷程 Day19-閉包 closure
下一篇
學JS的心路歷程 Day21-JS 支援物件導向?(二)
系列文
學JS的心路歷程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言