原型和原型鏈

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.prototypeObject.prototype 是兩個特殊的對象,他們由引擎來建立
  • 除了以上兩個特殊對象,其餘對象都是經過構造器 new 出來的
  • 函數的 prototype 是一個對象,也就是原型
  • 對象的 __proto__ 指向原型, __proto__ 將對象和原型鏈接起來組成了原型鏈
相關文章
相關標籤/搜索