前言
這本書類和行為委托的部分忍不住看了第二遍。覺得觀點很新穎,很有意思。
new調用函數的步驟
- 創建一個全新的對象
- 為新對象執行[[prototype]]連接
- 為新對象綁定函數調用的this
- 如果函數沒有返回其他對象,new表達式的函數調用會自動返回這個新對象
綁定的優先級
從弱到強
- 默認綁定
- 隱式綁定 上下文對象中函數調用等
- 顯式綁定 call,apply,bind
- new調用
綁定的例外
如果顯示綁定中傳入null 或者undefined作為this,則該顯示綁定被忽略。
用null可能會出問題,更安全的做法是使用{}
,或者Object.create(null)
,后者比前者少一個Object.prototype的委托
一些新方法備忘
-
Object.preventExtensions()
- 禁止添加新屬性
-
Object.seal()
- 在現有對象上調用
Object.preventExtensions()
,并把所有屬性的configurable
設置成false
- 在現有對象上調用
-
Object.freeze()
- 在現有對象上調用
Object.seal()
,并把所有屬性的writable
設置成false
- 在現有對象上調用
-
Object.propertyIsEnumerable
- 檢查屬性名是否存在于對象(而不是對象的原型鏈上),且
enumerable
為true
- 檢查屬性名是否存在于對象(而不是對象的原型鏈上),且
類風格的繼承
設置原型時推薦 child.prototype = Object.create(super.prototype)
;
查閱高級程序設計上是child.prototype = new Super()
;
書上的解釋其實我不太能理解
類和委托
作者推崇委托的概念。
傳統的類在被實例化的時候,它的行為(方法)會被復制到實例中去,當類被繼承的時候,行為(方法)會被復制到子類中去。
而Javascript中所有的函數只能被引用而不是復制。
比較了行為委托和仿類式繼承
- 代碼簡單
- 對象之間關聯關系簡單
- 不需要有類似顯式偽多態這種丑陋的語法
比較了行為委托和ES6 class
- ES6只是語法糖,并沒有改變內部復雜性
- super()實現了相對多態,但super定義是靜態的,會帶來某些問題
- 在繼承關系中需要建立共享屬性的話,還是需要用到丑陋的prototype
屬性的設置與屏蔽
myObject.foo = 'bar'
;
當foo屬性存在于原型鏈的上游時,會出現三種情況:
- 當[[prototype]]上有foo,且writable為true時,直接在
myObject
上添加 - 當[[prototype]]上有foo,且writable為false時,嚴格模式報錯,非嚴格模式則忽略
- 當[[prototype]]上有foo,且foo是一個setter,則調用這個setter