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 上讀取屬性或調用方法,為了解決這個問題,可以在取值時使用可選鏈,以免程式拋出錯誤。