JavaScript - 封裝(Encapsulation)
OOP 中的封裝,為類別擁有私有屬性或方法,使外部直接無法存取,必須呼叫特定的方法才可以存取類別內部的狀態,因此可以保護類別內的狀態不受外部引響。
OOP 中的封裝,為類別擁有私有屬性或方法,使外部直接無法存取,必須呼叫特定的方法才可以存取類別內部的狀態,因此可以保護類別內的狀態不受外部引響。
在 JavaScript 中的繼承與 OOP 的繼承意義不同,從技術上來說,原型繼承更像是實例將方法委託給其原型,模擬 OOP 子類別繼承父類別方法。
使用 Object.create() 指定一構造函式的 prototype 屬性為另一構造函式 prototype 屬性物件的原型,實現兩構造函式間的原型繼承。
1 | const Dog = function (firstName, birthYear) { |
使用 Object.create() 將 Dog.prototype 屬性物件設為 Pet.prototype 屬性物件的原型,使 Pet 的實例 aben 可以使用 Dog 上的 calcAge() 方法,但因為 Object.create() 不會設置新物件的 constructor 屬性,所以 Pet.prototype.constructor 仍然指向 Dog ,只能以 Pet.prototype.constructor = Pet 校正。
原型鏈示意圖 :

1 | class Dog { |
使用 extends 擴展類別作為子類別的父類,並於子類別的 constructor() 函式中呼叫 super() 方法,相當於自動執行父類別的 constructor() 函式。
若子類別中只有與父類別相同的屬性,沒有新增自己的屬性,就可以不用定義 constructor() 函式,子類別會自動調用父類別的 constructor()。
Object.create() 不用在意 prototype 屬性與 constructor()方法,只要創建物件並指定原型,就可以實現物件間的原型繼承。
1 | const DogPrototype = { |
原型鏈示意圖 :

原型鏈圖 :

重點整理 :
__proto__ 屬性等於構造函式的顯式原型 prototype 屬性。prototype 屬性默認指向一個空物件,但 Object 除外。Function 的實例,包括 Function 本身。物件導向程式設計(Object-oriented programming,OOP)是一種以物件概念為基礎的程式撰寫方式,使用物件模擬現實生活中的事物。在 JS 中並不存在傳統 OOP 的類別(class),而是以原型(prototype)實現物件導向。
當 JavaScript 的檔案越多,網頁載入的時間越久,為了縮減使用者等待的時間,可以使用<script> 標籤上的 async 或 defer 屬性,讓 script 檔案異步加載,加速網頁載入時間,提升使用者體驗。
JS 引擎中包含 Call Stack 與 Heap,在程式碼進入 Call Stack 之前,會先進行解析與編譯的過程,JavaScript 為即時編譯語言,可以比直譯語言更快的執行程式碼,提升運行速度。
當元素綁定的事件被觸發時,會經過三個階段,捕獲階段(CAPTURING_PHASE)、目標階段(AT_TARGET)與冒泡階段(BUBBLING_PHASE)。
文件物件模型(Document Object Model,DOM),為 HTML 文件的程式介面,提供 HTML 文件樹狀結構的模型,本身並不是 JavaScript 的一部分。
以純 CSS 或 JavaScript 完成三個網頁平滑滾動的方法。
Set 與 Map 都是 JavaScript 中特殊的資料結構,Set 與 Array 相似,但其中的每一個元素都是唯一值,不會有重複元素,主要用途是去除重複出現的元素與判斷元素存在與否;Map 則與 Object 相似,其中的 key 值映射對應 value,而 key 可以使用任意類型的值定義,且亦具備唯一性。
在取得 API 響應並存取數據時,時常會遇到 TypeError: Cannot read property 'xxx' of null 或是 TypeError: Cannot read property 'xxx' of undefined 的錯誤,而造成錯誤的原因就是試圖從 nullish value 上讀取屬性或調用方法,為了解決這個問題,可以在取值時使用可選鏈,以免程式拋出錯誤。