JS的知識點
基本概念
控制語句
對象
- 原型、原型鏈
- 對象分類
- new一個新對象
- 構造函數
- this 的隱士傳遞和顯示傳遞
三個最重要知識:
- JS公式:
對象.__proto__ === 其構造函數.prototype
- 根公理:
Object.prototype是全部對象的(直接或間接)原型
函數公理: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世界構造順序
- 建立根對象#101(toString),根對象沒有名字
- 建立函數的原型#208(call/apply),原型__p爲#101
- 建立數組的原型#404(push/pop),原型__p爲#101
- 建立Function #342(構造函數),原型__p爲#208
- 讓Function.prototype等價於#208(有名字了)
- 讓此時發現Function的__proto__和prototype都是#208
- 用Function建立Object(實際沒有名字)
- 讓Object.prototype等價於#101(有名字了)
- 用Function建立Array(實際沒有名字)
- 讓Array.prototype等價於#404(有名字了)
- 建立window對象(不屬於JS世界)
- 用window的'Object''Array'屬性將7和9中的函數命名
- 記住一點,JS建立一個對象,不會給這個對象名字
示例
- f.__proto__ === Function.prototype
- Funciont.__proto__ === Function.prototype
- Array.prototype.toString.__proto__ === Funciont.prototype
- Object.__proto__ === Function.prototype
- Array.prototype === [].__proto__(公式反着用)