JS的總結

JS的知識點

基本概念

  • 內存
  • 變量
  • 數據類型
  • 對象

控制語句

  • if...else...
  • for...

對象

  • 原型、原型鏈
  • 對象分類
  • new一個新對象
  • 構造函數
  • this 的隱士傳遞和顯示傳遞

三個最重要知識:

  1. JS公式:
    對象.__proto__ === 其構造函數.prototype
  2. 根公理:
    Object.prototype是全部對象的(直接或間接)原型
  3. 函數公理:javascript

    • 全部函數都是由Function構造的
    • 任何函數.__proto__ === Function.prototype
    • 任意函數都有Object/Array/Function

容易犯錯觀點

  • {name:‘frank’}.__proto__ 的原型 === Object.prototype
  • [1,2,3].__proto__ 的原型 === Array.prototype
  • Object.__proto__ 的原型 === Function.prototype

問題:
Object的原型是Object.__proto__?
解讀:
對的. [的原型]等價於[.__proto__];中文的[原型]沒法區分.__proto__與prototype。因此默認約定了原型用.__proto__。
可是並不意味這兩個是徹底相等的意思java

觀點矛盾:數組

  • [1,2,3]的原型是Array.prototype
  • Object.prototype是全部對象的原型
  • 爲何Object.prototype不是[1,2,3]的原型呢?

解讀:app

  • 原型分2種狀況,直接原型和間接原型
  • 對於普通對象來講,Object.prototype是直接原型
  • 對於數組,函數來講,Object.prototype是間接原型

本身屬性
直接原型
間接原型

錯誤觀點:
Object.prototype不是根對象(X)
理由:函數

  • Object.prototype是全部對象的原型
  • Object.prototype是Function構造出來的
  • 因此,Function構造了Object.prototype
  • 推論,Function纔是萬物之源

解答:this

  • Object.prototype 和 Object.prototype對象 的區別
  • 對象裏面歷來不會包含另外一個對象,只會包含另外一個對象的地址
  • Function構造了Object.prototype的地址,並無構造那個對象,Object.prototype是根對象,可是不能說Function就是根對象,只能說構造出存儲根對象地址的屬性

Object.prototype 和 Object.prototype對象 區別:

  • 就代碼而言,沒辦法區分,只能用內存圖來區分,有2個意思
  • Object.prototype在Objec裏面,由於這裏的prototype指2個東西:地址和對象,在中文描述時,默認地址就是那個對象。
  • 若是問Object.prototype這個地址對應的對象在不在Object裏面?回答是不在,由於它在路徑#202[toString...](這裏內存圖隨便一個地址)裏面,而Object在prototype:#202這個位置

JS世界構造順序

  1. 建立根對象#101(toString),根對象沒有名字
  2. 建立函數的原型#208(call/apply),原型__p爲#101
  3. 建立數組的原型#404(push/pop),原型__p爲#101
  4. 建立Function #342(構造函數),原型__p爲#208
  5. 讓Function.prototype等價於#208(有名字了)
  6. 讓此時發現Function的__proto__和prototype都是#208
  7. 用Function建立Object(實際沒有名字)
  8. 讓Object.prototype等價於#101(有名字了)
  9. 用Function建立Array(實際沒有名字)
  10. 讓Array.prototype等價於#404(有名字了)
  11. 建立window對象(不屬於JS世界)
  12. 用window的'Object''Array'屬性將7和9中的函數命名
  13. 記住一點,JS建立一個對象,不會給這個對象名字

圖示

示例

  • Object.prototype.__proto__ === null
  • Function.prototype.__proto__ === Object.prototype
  • > var f = () => {}
    < undefined
  1. f.__proto__ === Function.prototype
  2. Funciont.__proto__ === Function.prototype
  3. Array.prototype.toString.__proto__ === Funciont.prototype
  4. Object.__proto__ === Function.prototype
  5. Array.prototype === [].__proto__(公式反着用)
相關文章
相關標籤/搜索