prototype和__proto__的關系是什么?


我們創建的每個函數都有一個prototype(原型)屬性,這個屬性是一個對象,它的用途是包含可以由特定類型的所有實例共享的屬性和方法。這個對象下面有個屬性,這個屬性是另外一個對象的應用 ,這個屬性就是一個對象。)

 

function是對象,function的原型prototype也是對象,它們都會具有對象共有的特點。即:對象具有屬性__proto__,每個對象都會在其內部初始化一個屬性,就是__proto__,當我們訪問一個對象的屬性 時,如果這個對象內部不存在這個屬性,那么他就會去__proto__里找這個屬性,這個__proto__又會有自己的__proto__,於是就這樣 一直找下去,也就是我們平時所說的原型鏈的概念。__proto__可稱為隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例能夠訪問在構造函數原型中定義的屬性和方法。

 

funcition這個特殊的對象,除了和其他對象一樣有上述_proto_屬性之外,還有自己特有的屬性——原型屬性(prototype),這個屬性是一個指針,指向一個對象,這個對象的用途就是包含所有實例共享的屬性和方法(我們把這個對象叫做原型對象)。prototype是通過調用構造函數而創建的那個對象實例的原型對象。使用原型對象的好處是可以讓所有對象實例共享它所包含的屬性和方法,不必在構造函數中定義對象實例的信息,而是可以將這些信息直接添加到原型對象中。原型對象也有一個屬性,叫做constructor,這個屬性包含了一個指針,指回原構造函數。

 

ptototype和__proto__聯系

prototype和__proto__都指向原型對象,任意一個函數(包括構造函數)都有一個prototype屬性,指向該函數的原型對象,同樣任意一個構造函數實例化的對象都有一個__proto__屬性(__proto__並非標准屬性,ECMA-262第5版將該屬性或指針稱為[[Prototype]],可通過Object.getPrototypeOf()標准方法訪問該屬性),指向構造函數的原型對象。---sinのstone

 

 ptototype和__proto__區別

//a作為構造函數時的prototype屬性與a作為普通函數時的__proto__屬性並不相等
console.log(a.prototype == a.__proto__);//false

console.log(a.__proto__);         //function (){}
console.log(a.__proto__ == Function.prototype);//true

//a作為一個普通函數調用時,它的構造函數是內置對象Function,所以它指向的原型對象,就是Function.prototype.
//其實這個和console.log(b.__proto__ == a.prototype)是一樣的道理

//a作為構造函數時,它的原型,和它的原型的原型
console.log(a.prototype);                   //a{}
console.log(a.prototype.__proto__);  //Object{}

//a作為普通函數時,它原型的原型
console.log(a.__proto__.__proto__); //Object{}

console.log(a.__proto__.__proto__ == a.prototype.__proto__); //true

 

所有對象都有__proto__屬性,函數這個特殊對象除了具有__proto__屬性,還有特有的原型屬性prototype。prototype對象默認有兩個屬性,constructor屬性和__proto__屬性。prototype屬性可以給函數和對象添加可共享(繼承)的方法、屬性,而__proto__是查找某函數或對象的原型鏈方式。constructor,這個屬性包含了一個指針,指回原構造函數。

 

 

參考:高級程序設計(第三版),以及sinのstone博客,武家小妮兒博客。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM