本文主要是根據《JavaScript高級程序設計》摘抄學習而成。
6.1 理解對象
兩種屬性:數據屬性和訪問器屬性。特性:描述屬性的各類特徵,是爲了實現JavaScript引擎用的,不能直接訪問。函數
-
數據屬性,有4個特性:學習
-
[[Configurable]]:表示可否經過 delete 刪除屬性從而從新定義屬性,可否修改屬性的特性,可否把屬性修改成訪問器屬性。this
-
[[Enumerable]]:表示可否經過 for-in 循環返回屬性。prototype
-
[[Writeable]]:表示可否修改屬性的值。設計
-
[[Value]]:包含這個屬性的數據值。指針
-
訪問器屬性,有4個特性: [[Configurable]]:表示可否經過 delete 刪除屬性從而從新定義屬性,可否修改屬性的特性,可否把屬性修改成數據屬性。對象
-
[[Enumerable]]:表示可否經過 for-in 循環返回屬性。繼承
-
[[Get]]:在讀取屬性時調用的函數。ip
-
[[Set]]:在寫入屬性時調用的函數。原型鏈
定義及讀取特性:Object.defineProperty()、Object.defineProperties()、Object.getOwnPropertyDescriptor()
6.2 建立對象
- 工廠模式:雖然解決了建立多個類似對象的問題,但卻沒有解決對象識別的問題。
- 構造函數模式(構造函數應該以大寫字母開頭)
構造函數模式這種方法會經歷4個步驟:
- 建立一個新對象
- 將構造函數的做用域賦給新對象(this指向這個新對象)
- 執行構造函數中的代碼(爲新對象添加屬性或方法)
- 返回新對象
構造函數的問題:每一個方法都要在每一個實例上從新建立一遍。
- 原型模式:每一個函數都有一個 prototype 屬性,這個屬性是一個指針,指向一個對象(函數的原型對象),這個對象包含能夠由該類型的全部實例共享的屬性和方法。
- 理解原型對象:
- 只要建立一個新函數,就會根據一組特定的規則爲該函數建立一個 prototype 屬性,指向原型對象
- 默認全部原型對象都會得到一個 constructor 屬性,指向 prototype 屬性所在函數
- 調用構造函數建立新實例後,實例將有一個 proto 屬性,指向構造函數的原型對象,指針叫[[Prototype]],默認原型指向Object
- 實例與構造函數沒有直接關係
- 讀取屬性:搜索先從對象實例自己開始,若是沒找到,搜索原型對象
- 使用 isPrototype() 來檢測構造函數和實例之間是否有關係
- 使用 hasOwnProperty() 來檢測屬性存在於實例中仍是原型中
6.3 繼承
- 最經常使用的繼承:組合繼承。融合了原型鏈和構造函數的優勢。
- 原型式繼承:能夠在沒必要須先定義構造函數的狀況下實現繼承,其本質是執行對給定對象的淺複製。而複製獲得的副本還能夠獲得進一步改造。
- 寄生式繼承
- 寄生組合式繼承