每個函數在建立以後都會擁有一個名爲prototype的屬性,這個屬性指向函數的原型對象。瀏覽器
隱式原型指向建立這個對象的構造函數(constructor)的prototypeapp
若是在obj中找不到,那麼就會沿着__proto__依次查找。函數
實例:spa
聲明構造函數A,給A的原型對象添加一個屬性和一個方法,prototype
用函數A建立一個對象a:code
1 A.prototype.name = "Jack"; 2 A.prototype.say = function () { 3 console.log("hello"); 4 }
6 function A() { 7 8 } 9 var a = new A( );
咱們來觀察一波控制檯的輸出。。。對象
首先,對象a的__proto__(隱式原型)指向A的prototype(原型對象)blog
而a.__proto__.__proto__又等價於下面那一大串東西,其實也等價於全部對象的祖先的原型對象——Object.prototype繼承
而在原型鏈的定義中,Object.prototype即原型鏈的終點,再往上就沒有了。ip
而構造函數A的prototype,也就是對象a的__proto__所指向的地方
隱式原型指向構造該對象的構造函數的原型(A.__proto__ === A.constructor.prototype)。
由於function是特殊的對象,"Function.prototype"
,即全部函數的原型,一般函數均可以認爲是經過new Function製造出來的。
換句話說,Function.prototype
上面承載了用於繼承給全部函數的那些屬性,例如:call、bind、apply等。
部份內容參考自:https://www.zhihu.com/question/34183746/answer/59043879