如圖比較好的闡述了prototype和__proto__javascript
簡單的能夠這麼理解:java
狗類A( function foo()),狗類A的模板描述:A.模板 (foo.prototype)是一個對象object, A.模板有個構造方法 foo.prototype.constructor=function foo()函數
動物B(function function()), 動物B的模板描述 . B.模板 (function.prototype), B.模板有個構造方法 function.prototype.constructor=function function()spa
狗C= new 狗類A (f1=new foo())prototype
那麼狗c的父類模板=A.模板 即 f1.__proto__= foo.prototype.設計
狗類A的父類模板=B.模板 即 foo.__proto__=function.prototype對象
只有函數有prototype,對象是沒有的。blog
可是函數也是有__proto__的,由於函數也是對象。函數的__proto__指向的是Function.prototype。繼承
也就是說普通函數是Function這個構造函數的一個實例。ip
__proto__能夠理解爲指向父類模板的一個引用。用來查找父類模板的
prototype能夠理解爲對象的一個屬性,用來描述自身若是做爲模板是如何定義的,該模板有方法和屬性。
function foo() 自身若是做爲模板prototype,它自身會有構建函數,模板的屬性constructor就是描述這個構建函數。
foo()這個對象其實是隱含從父類模板繼承過來的,這個父類模板就是function function()的模板屬性。即它的prototype.
設計者定義的時候名稱比較混淆不利於理解。這是javascript的敗筆。