標籤:
第6章
1.ES有兩種屬性:資料屬性和訪問器屬性。屬性中包含各種特性,表示屬性的各種特徵。
資料屬性:[[Configurable]],[[Enumerable]],[[Writable]],[[Value]]
修改屬性使用方法:Object.defineProperty()
訪問器屬性:[[Configurable]],[[Enumerable]],[[Get]],[[Set]]
訪問器屬性不包含數值。只能通過Object.defineProperty()定義。通過設定set和get函數,分別設定讀取和寫入的時候的行為。P141
2.屬性的特性的其他方法:
Object.defineProperties()設定多個屬性和其特性
Object.getOwnPropertyDescriptor()讀取屬性的特性
3.建立對象的模式:
4.原廠模式:解決了重複代碼問題,但無法識別物件類型
5.建構函式模式:能夠識別物件類型,但每個方法都要在執行個體上重新建立一遍。不同執行個體上的同名函數不等。
一個函數通過new來調用就是建構函式,直接調用就是普通函數。
6.原型模式:不必在建構函式中定義對象執行個體的資訊,而是將這些資訊直接添加到原型對象中,讓所有對象執行個體共用它包含的屬性和方法。
原型對象:(1)建立新函數時,同時建立函數的prototype屬性,指向該函數的原型對象。
(2)原型對象產生一個constructor屬性,指向原型所在函數。
(3)調用建構函式建立新執行個體,執行個體內部包含一個指標[[prototype]],指向原型對象
原型對象的方法:Object.prototype.isPrototypeOf(執行個體),Object.getPrototypeOf(執行個體),執行個體.hasOwnProperty(屬性),Objet.key(執行個體or原型),Object.getOwnPropertyNames(執行個體或原型)
如果在調用建構函式建立一個執行個體後,重寫原型對象,那麼執行個體的[[prototype]]無法指向新的原型對象。P156
原型模式弊端:所有執行個體擁有相同屬性值,由於共用,執行個體1的修改會在執行個體2中體現出來
7.組合使用建構函式模式和原型模式:將屬性定義在建構函式中,原型定義方法和需要共用的屬性
8.動態原型模式:當方法不存在時,就在原型建立方法
9.寄生建構函式模式:在建構函式中建立新對象,再返回該對象。
建構函式在不傳回值的時候,預設會返回新對象執行個體。通過在建構函式的末尾添加一個return,可以重寫調用建構函式返回的值。
10.穩妥建構函式模式:避免使用this和new,某些屬性值只有通過唯一的方法才能訪問。
js高程筆記6章