prototype瀏覽器
每一個函數都有一個 prototype 屬性,它實際上是個對象。函數
__ proto __prototype
在 JavaScript 中,每一個實例對象都有一個私有屬性[[Prototype]]
,該屬性指向了這個實例對象的原型,你能夠經過 ES6 的 Object.getPrototypeOf() 來訪問該屬性,許多瀏覽器也對 [[Prototype]]
進行了實現,也就是咱們常常見到的 __proto__
,沒錯,__proto__
指向了實例對象的原型,它也是一個對象。code
constructorcdn
constructor 這個字段的內容是一個函數,函數名和構造函數居然同樣。能夠說,每一個原型對象都有一個 constructor 屬性,指向相關聯的構造函數,因此構造函數和構造函數的 prototype 是能夠相互指向的。對象
小結blog
JavaScript 對象(除了 null)在建立的時候就會關聯一個對象,這個對象就是原型,每個對象都會從原型上繼承屬性,原型也是對象,因此原型也有原型對象,層層往上,直到Object.prototype,這就是原型鏈。對象都會有一個 __proto__
屬性來訪問本身的原型,同時這個原型就是生成該對象的構造函數的 prototype 屬性值。每一個原型對象都有一個 constructor 屬性,指向相關聯的構造函數。繼承
咱們知道函數都是經過 new Function()
生成的,難道 Function.prototype
也是經過 new Function()
產生的嗎?答案也是否認的,這個函數也是引擎本身建立的。首先引擎建立了 Object.prototype
,而後建立了 Function.prototype
,而且經過 __proto__
將二者聯繫了起來。這裏也很好的解釋了上面的一個問題,爲何 let fun = Function.prototype.bind()
沒有 prototype
屬性。由於 Function.prototype
是引擎建立出來的對象,引擎認爲不須要給這個對象添加 prototype
屬性。ip
Object
是全部對象的爸爸,全部對象均可以經過 __proto__
找到它Function
是全部函數的爸爸,全部函數均可以經過 __proto__
找到它Function.prototype
和 Object.prototype
是兩個特殊的對象,他們由引擎來建立new
出來的prototype
是一個對象,也就是原型__proto__
指向原型, __proto__
將對象和原型鏈接起來組成了原型鏈