對象、類、原型和委托《你不知道的JavaScript-上》讀書筆記2

前言

這本書類和行為委托的部分忍不住看了第二遍。覺得觀點很新穎,很有意思。

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
    • 檢查屬性名是否存在于對象(而不是對象的原型鏈上),且enumerabletrue

類風格的繼承

設置原型時推薦 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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容