如何理解_proto_和prototype

(如何理解_proto_和prototype)

原型空間

咱們知道在js中萬物皆對象,如今咱們假設每個對象建立時都會產生一個原型空間(原型對象 )函數

如今咱們記住三句話

實例由其定義共享原型空間
由__proto__來尋找定義的原型空間
由prototype來尋找本身的原型空間spa

實例由其定義共享原型空間

psprototype

p:prototype
[p]: _proto_
此圖片爲轉載

此圖片爲轉載
設計


從上面兩張圖能夠清楚看出這種關係這樣就能夠造成原型鏈


全部函數都是由Function構造函數構造的
function函數也是Function構造函數構造的因此時function本身構造了本身因此本身指向本身的原型空間
咱們能夠看出圖中function的原型空間和animal的原型空間都是object類型(其實第二列的原型空間都是object的實例,但邏輯上不是)3d

//全部函數類型的隱式原型都相同 由於都是Function的原型對象建立
//因此構造函數的__proto__是Function
//那麼Function的隱式原型 ?
var fun = new Function();
console.log(fun.__proto__===Function.prototype);
console.log(Function.__proto__===Function.prototype);
//因此Function自己的隱式原型和顯示原型相同
//能夠看出Object也是函數定義的因此他的隱士原型應該是Function 的顯示原型
console.log(Object.__proto__===Function.prototype)

那麼object的原型空間的原型空間應該是undefined但這樣就會讓原型鏈沒有盡頭
爲了邏輯完善就令其爲null
能夠看出原形空間的定義是由其定義的原型空間來定義的(實例和其定義共享原型空間)指針

function Animal(){}
function Bird(){}
function Swallow(){}
Bird.prototype= new Animal()
Swallow.prototype=new Bird() 
var swallow = new Swallow()
console.log(swallow.__proto__.prototype)
console.log(Swallow.__proto__.prototype)
console.log(Bird.__proto__.prototype)
console.log(Animal.__proto__.prototype)
console.log(Function.prototype.__proto__.prototype)
console.log(Swallow.prototype)
console.log(Animal.prototype)
var animal = new Animal
console.log(animal.__proto__.__proto__)
var obj = {}
console.log(typeof (obj.__proto__.__proto__))
////ps沒有修正construct

那麼若假設Pobject來定義了Object的原型空間的原型空間那麼圖中全部的(undefined)的位置的_proto_都會指向Pobject的原型空間以這個邏輯就能夠讓無限迭代下去(指針的指針的.....的指針)
這樣向上尋找原型鏈和向下尋找原型鏈就統一了,但js設計封鎖了向上無限迭代(Object的原型空間爲null)code

相關文章
相關標籤/搜索