什麼是 Prototype 、繼承與原型鏈 ?


Posted by hoyi-23 on 2021-08-12

原型(prototype)

JavaScript 有一個特性是源自於 Java,就是可以使用 new 語法來新增一個物件。不過兩者的根本運作是不同的。
使用new語法新增的物件,會有繼承的特性。
在Java內屬於類別繼承,而在JavaScript內屬於原型繼承

繼承與原型鏈

JavaScript 就只有一個建構子:物件。
JavaScript並沒有類別的概念,所以需要用原型的方式,做出如同類別繼承的方法。

每當我們建立一個物件實體,這個物件實體會有一個連著其他原型(prototype)的私有屬性(private property)物件。這個原型物件也有著自己的原型,於是原型物件就這樣鏈結,直到撞見 null 為止:null 在定義裡沒有原型、也是原型鏈(prototype chain)的最後一個鏈結。


原型的特性

  1. 具有物件的特性(每個原型都有屬性與方法)
  2. 向上查找的特性(每個繼承的物件,都能一直向上查找)
  3. 原型的屬性與方法是共用的(若原型更新,跟著它的物件們都會更新)
var a = [1,2,3]
console.log(a)//[1,2,3]

這個 proto 就是上面a陣列的原型,所有的物件實體都可以利用.來取用屬性與方法。

a.forEach((i)=>console.log(i))

我們也可以透過語法在原型上新增方法

Array.prototype.getLast = function(){...}

使用建構式自定義原型

主要重點:

  1. 建構函式
  2. 透過 prototype 新增方法
  3. 透過 new operator 產生新物件
    //建構函式 -- 藍圖
    function Member(name, age, gender){
     this.name = name;
     this.age = age;
     this.gender = gender;
    }
    //透過 prototype 新增方法
    Member.prototype.hello = function(){
     console.log('Hi' + this.name)
    }
    
    目前它還只是一個建構函式,我們可以把它想成藍圖。若要讓它成為一個實體需要透過new
    ### new
  4. new運算子會產生一個新的物件(表示它和其他從同個原型出來的物件不會有關聯)。
  5. 新產生物件會連結回原本的建構物件(建構函式)。
  6. 新產生的物件的this綁定在建構物件上。
    ```
    var Andy = new Member('Andy',25,'male');
    console.log(Andy)// Member{name:'Andy', age:25, gender:'male'}

Andy.hello() // 'Hi Andy'
`` 目前Andy這個物件就有自己的屬性,點進去proto`會看到constructor是從Member這個物件出來的。


Object.create()把其他物件作為原型使用

CodePen 練習


自訂原型 與 原生原型 的不同

自訂原型的屬性特徵可以被列舉。原生原型的屬性特徵不能被列舉。


#prototype #原型鏈 #原型繼承







Related Posts

[JS] 陳述式(Statement)與表達式(Expression)

[JS] 陳述式(Statement)與表達式(Expression)

<form> Attributes

<form> Attributes

DOM 的事件傳遞機制

DOM 的事件傳遞機制


Comments