咱們知道在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