我是這樣理解的:每個JavaScript對象在建立的時候就會與之關聯另一個特殊的對象,這個對象就是咱們常說的原型對象,每個對象都會從原型「繼承」屬性和方法。數據結構
一個由有限個原型對象組成的用來實現繼承和共享屬性的對象鏈。函數
打個通俗的比方,能夠把原型鏈理解成一個家族的血親關係,每個後代都會從父代身上繼承該家族特有的基因和特徵。prototype
關於原型的繼承,咱們常說每個對象都會從原型上"繼承"屬性,實際上,此"繼承"並不是意味着簡單的複製,而是一個可訪問的通道,引用《你不知道的JavaScript》中的一句話:指針
繼承意味着複製操做,然而JavaScript默認並不會複製對象的屬性,相反,JavaScript只是在兩個對象之間建立一個關聯,這樣,一個對象就能夠經過委託訪問另外一個對象的屬性和函數,因此與其說是繼承,委託的說法反而更加準確。code
Object.__proto__
= Function.prototype
Object.prototype
是原型鏈的頂端,Object.prototype.__proto__
= nullFunction.__proto__
= Function.prototype
Function.prototype
用於共享,而Function.prototype__proto__
繼承自Object.prototype
Array.__proto__
= Function.prototype
Array.prototype
用於共享,Array.prototype.__proto__
繼承自Object.prototype
做爲對象:Person.__proto__
= Function.prototype
對象
做爲函數:Person.prototype
用於共享,Person.prototype.__proto__
繼承自Object.prototype
繼承
原型鏈關係:ip
原型鏈頂端是Object.prototype
原型鏈
JavaScript原生對象(Object、Function、Array等)都是Function的實例,它們的__proto__
均指向Function.prototype
原型
除了Object,全部原生對象(構造函數)的prototype
,均繼承自Object.prototype
JavaScript數據結構
JavaScript數據結構和原型鏈之間的關係以下圖: