原型鏈

默認原型鏈

function Person() {}
var p = new Person();

clipboard.png

  • p對象的原型對象__proto__裏能夠看出,constructor等於Person,能夠得出p是由Person這個構造函數建立出來的,而且p繼承自Person.prototype原型,p.__proto__Person.prototype指向的是同一個原型函數

    p.__proto__ === Person.prototype //true
  • 原型也是一個對象,既然是對象就有原型,那麼原型的原型是誰呢?由上面的截圖能夠看出:__proto__:Object是原型對象的原型,將其展開獲得如下截圖:工具

    clipboard.png

    p.__proto__.__proto__ === Object.prototype //true
  • Object.prototype的原型對象是什麼呢?經過調試工具能夠獲得答案

    clipboard.png

  • 經過上面截圖得知,原型對象是null,注意這裏是null,並非undefined,說明它是存在原型定義的,只是定義的值是null,若是是沒有定義的話,這裏應該會顯示undefinednull是原型鏈的頭。

總結

經過調試工具查看js對象的原型結構,當前對象的__proto__屬性下的constructor屬性的類型是當前對象的真實類型,那麼當前對象的原型也就是構造函數類型.prototype。(p對象的真實類型是Person,因此p的原型就是Person.prototype)根據此結論往下推到,__proto__屬性裏的__proto__屬性裏的constructor屬性類型也就是__proto__原型對象的真實類型,__proto__原型對象的原型對象也是構造函數.prototype。(__proto__對象的真實類型是Object__proto__的原型對象是Object.prototypeObject.prototype的原型對象是null,也就到頭了。spa

修改原型鏈

function Person() {}
Person.prototype = [];
var p = new Person();

原型鏈結構如圖所示:prototype

clipboard.png

clipboard.png
[]賦值給了Person的原型對象,因此默認的原型鏈發生了改變。[]至關因而new Array()
原型鏈結構:調試

p -> [] -> Array.prototype -> Object.prototype -> null

總結

若是默認原型鏈沒有被改變,p的原型是Person.prototype,但因爲Person.prototype[]賦值了,因此p的原型是[],因爲[]至關因而new Array(),因此[]的原型是Array.prototype,從調試界面中獲得Array.prototype的原型對象是Object.prototype,最後是nullcode

相關文章
相關標籤/搜索