JS之路 Day07 - 語法糖Class(下)
前言
今天會來繼續介紹語法糖Class
的語法部分,會介紹到的分別為:
- 「extends」、「super」 keywords
- static properties and methods
extends and super
首先昨天已經知道了,class
可以依靠constructor
跟prototype
的原理來去實作出像是其他程式語言的繼承效果,但是class
以及class
之間的繼承還是一個問題,為了這件事情,JavaScript
有提供在class
中可以使用extends
跟super
來解決這件事情。
原本單純使用class
來寫會是長這樣:
1 | class Parent |
使用extends
關鍵字的語法是:
1 | class Child extends Parent |
這邊使用 MDN 上面的範例修改過後來做講解:
1 | class Animal { |
一步步去拆分extends
跟super
做了哪些事情。
- 會發現說 Dog 使用
extends
指定 Animalclass
Dog 這個新的class
想要獲得 Animal 這個舊的class
的繼承,相當於就直接繼承了 Animal 裡面所有的Properties
和 Method
,那這邊會有一個問題出現,那super
的作用何在?
- 用
super
呼叫extends
指定的 Animalclass
沒有加super
直接把super(name);
給刪掉的話,會報錯,訊息如下:
ReferenceError: Must call super constructor in derived class before accessing ‘this’ or returning from derived constructor
但如果是把:
1 | constructor(name) { |
這段完全刪掉的話,不會報錯,然後結果也看起來一模一樣。
這是因為今天如果不需要透過 Dog 去新增屬性(就是寫在constructor
裡面的東西),只是增加方法,或是使用繼承而來的方法,那就可以把super
省略掉也可以。
簡單來說,用到super
可以讓JavaScript
判斷說 extends
過的那個 class,有沒有需要替換掉那個繼承的東西,示意圖:
1 | class Dog extends Animal { |
JavaScript
沒辦法判斷到底要以誰的為準,所以創造出了叫做super
的關鍵字,主要的功能如下:
- 使用 supe(…)的方式,來指定可以使用繼承的
constructor
- 使用 super.method(…)的方式來直接呼叫那個方法
假如說,我想要讓 Dog 創造出來的實例在說話speak()
時,多說一句你好sayHi()
:
1 | class Animal { |
這樣的話,就是讓 Dog 在繼承了 Animal 這個 class 所有的屬性之外,也可以去使用 Animal 的 speak()方法,然後在這個基礎之外,再去新增新的功能也是沒有問題。
透過這種使用extends
跟super
的搭配就可以做到讓彼此 class 之間的繼承。
static methods and properties
static methods
中文是叫做靜態方法,就是我可以在 class 裡面的constructor
去進行呼叫靜態方法,但創造出來的實例是無法去取用的,舉例來說:
1 | class Person { |
假如使用static
這個關鍵字在 class 內的 Method 中,那個 Method 就會變成static method
,像這邊來說,Person
就變得可以使用sayHello
這個方法,但同時創造出來的實例就將會變得無法執行,可以來試試看。
1 | const apple = new Person("apple"); |
會報錯,找不到無法使用。
可以理解成,一般狀態下是動態的,創建出來的實例可以隨著自身的class
動態使用它,可以用static
使其變成靜態,在靜態時可以直接從class
取用方法。
而關於靜態時候的屬性也是可以做得到的,靜態就屬性就代表可以直接從class
取用的屬性,舉例來說:
1 | class Apple { |
加上了static
的屬性就可以直接在class
去使用的,像上面就可以直接用 Apple 去取得 color 的屬性,就其實就相當於直接給 Apple 做一個賦值的動作。
總結
今天介紹了一些Class
語法糖的使用方式,可能就算不會寫class
也一樣可以寫JavaScript
,但是學會了這個技巧可以幫助成為自己成為一個更棒的工程師,基本的 class 就先介紹到這邊~
reference
[1] MDN - Classes
[2] JavaScript | ES6 中最容易誤會的語法糖 Class - 基本用法
[3] Class inheritance