Sean's Blog

An image showing avatar

Hi, I'm Sean

這裡記錄我學習網站開發的筆記
歡迎交流 (ゝ∀・)b

LinkedInGitHub

ES6 Class & Extends 與 ES7 現代寫法

本文介紹 ES6 Class 實體與繼承的概念,以及進入 ES7 後出現的簡化寫法。

Class

Class 就像是 Object 的藍圖

一個 Class 可以透過 class 關鍵字來創建,它可以有屬性 (Property) 與方法 (Method),也就是這個 Class 的變數與函式。

其中 constructor() 是構造函式,也是 Class 的默認方法,可以在裡面設置屬性。

透過 new 關鍵字可以創建 Class 的實體,並且支援繼承,也就是可以有另一個 Class 繼承它的父類別的屬性與方法,同時也能添加新的屬性與方法。

1class Person {
2  constructor() {
3    this.name = 'Sean';
4  }
5
6  printName() {
7    console.log('My name is ', this.name);
8  }
9}
10
11const Sean = new Person();
12Sean.printName(); // "My name is Sean"

Extends

透過 extends 關鍵字可以繼承父類別的屬性與方法。

特別注意!如果有繼承父類別,就要記得在子類別的 constructor() 加上 super(),以確保父類別的 constructor() 有被初始化,這樣才能確保父類的屬性可以在子類別中被使用。

1class Human {
2  constructor() {
3    this.gender = 'female';
4  }
5  printGender() {
6    console.log(`My gender is ${this.gender}`);
7  }
8}
9
10class Person extends Human {
11  constructor() {
12    super();
13    this.name = 'Sean';
14    this.gender = 'male';
15  }
16  printName() {
17    console.log(`My name is ${this.name}`);
18  }
19}
20
21const Sean = new Person();
22Sean.printName(); // "My name is Sean"
23Sean.printGender(); // "My gender is male"

Class 在 ES7 更新的寫法

ES6 的 Class 是使用構造函式設定屬性,但是到了 ES7 我們可以跳過構造函式直接在 Class 底下分配屬性。實際上這仍然是在做構造函式做的事情,但是寫法上簡化了許多,讓定義 Class 屬性時更加方便。

ES7 的 Class 將方法寫成了一個儲存值為函式的屬性,寫法是方法名稱等於箭頭函式,也因為是使用箭頭函式,所以 this 不會更改它的參考,也就解決了 this 關鍵字的問題。

從繼承 HumanPerson 類別中可以發現,在 ES7 的寫法下可以直接分配屬性,不用再寫 constructor()super(),而方法也要改為使用箭頭函式哩。

1class Human {
2  gender = 'female';
3
4  printGender = () => {
5    console.log(`My gender is ${this.gender}`);
6  };
7}
8
9class Person extends Human {
10  name = 'Sean';
11  gender = 'male';
12
13  printName = () => {
14    console.log(`My name is ${this.name}`);
15  };
16}
17
18const Sean = new Person();
19Sean.printName(); // "My name is Sean"
20Sean.printGender(); // "My gender is male"

以上資源是我自己整理過後的筆記,若有錯誤歡迎隨時和我聯繫