welcome to Cheeto's blog

0%

JavaScript核心篇:原型在哪裡?

原型在哪裡?

JavaScript 是一門物件導向的程式語言,因為沒有 Class,所以它的繼承方法是透過 「原型」(prototype) 來進行實作。

原形的特性

  • 一樣具有物件的特性
  • 向上查找
  • 原型可共用方法及屬性

當我們嘗試在某個物件找一個它本身並不存在的屬性時,它會往上(原型物件)找尋,直到找到最頂層級時,都會找到Object.prototype才會停止。

JS當中原型跟實體都是物件,而兩者都有屬性及方法

原形鍊-概念

這邊可以看到實體可以繼承原型的屬性及方法,實體也能夠自定義自己的屬性及方法。

原形鍊-圖解

這邊可以看到原型找不到屬性或方法時會往它的原型去尋找,假設它沒有找到的話,它會繼續往上面的原型去找,直到找到最頂層級。

原型的方法都能夠用點運算子呼叫出來

原形鍊-圖解2

如果一個原型新增了兩個實體的話,那這兩個實體都會繼承原型的屬性。

1
2
3
4
var a = [1, 2, 3];
console.log(a, a[1], a.length);

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

原形鍊-原型說明

這邊可以看到 a 的原型是 array

而只要是實體都能夠繼承原型的屬性及方法,這邊也能夠看到 a 能夠使用 arrayforEach() 這個方法。


這邊我們用 __proto__ 來新增原型的方法。

這個原型的方法非正規,這邊只是示範用

1
2
3
4
5
6
7
8
9
10
11
12
var a = [1, 2, 3];

a.__proto__.getLast = function (e) {
//傳入該陣列最後一個值
return this[this.length -1];
}

var b = [4, 5, 6];

//原型共用特性
console.log(a.getLast()); // 3
console.log(b.getLast()); // 6

這邊如果輸入 ab 可以發現這點

原形鍊-原型說明2

原形鍊-原型說明3

它們同樣都繼承了 arraygetLast() 這個方法,所以都能夠共用 getLast() 這個方法。