function Person() {} var p = new Person();
從p
對象的原型對象__proto__
裏能夠看出,constructor
等於Person
,能夠得出p
是由Person
這個構造函數建立出來的,而且p
繼承自Person.prototype
原型,p.__proto__
與Person.prototype
指向的是同一個原型函數
p.__proto__ === Person.prototype //true
原型也是一個對象,既然是對象就有原型,那麼原型的原型是誰呢?由上面的截圖能夠看出:__proto__:Object
是原型對象的原型,將其展開獲得如下截圖:工具
p.__proto__.__proto__ === Object.prototype //true
Object.prototype
的原型對象是什麼呢?經過調試工具能夠獲得答案null
,注意這裏是null
,並非undefined
,說明它是存在原型定義的,只是定義的值是null
,若是是沒有定義的話,這裏應該會顯示undefined
。null
是原型鏈的頭。經過調試工具查看js
對象的原型結構,當前對象的__proto__
屬性下的constructor
屬性的類型是當前對象的真實類型,那麼當前對象的原型也就是構造函數類型.prototype
。(p
對象的真實類型是Person
,因此p
的原型就是Person.prototype
)根據此結論往下推到,__proto__
屬性裏的__proto__
屬性裏的constructor
屬性類型也就是__proto__
原型對象的真實類型,__proto__
原型對象的原型對象也是構造函數.prototype
。(__proto__
對象的真實類型是Object
,__proto__
的原型對象是Object.prototype
)Object.prototype
的原型對象是null
,也就到頭了。spa
function Person() {} Person.prototype = []; var p = new Person();
原型鏈結構如圖所示:prototype
[]
賦值給了Person
的原型對象,因此默認的原型鏈發生了改變。[]
至關因而new Array()
原型鏈結構:調試
p -> [] -> Array.prototype -> Object.prototype -> null
若是默認原型鏈沒有被改變,p
的原型是Person.prototype
,但因爲Person.prototype
被[]
賦值了,因此p
的原型是[]
,因爲[]
至關因而new Array()
,因此[]
的原型是Array.prototype
,從調試界面中獲得Array.prototype
的原型對象是Object.prototype
,最後是null
。code