先來作個複習,ES5中有有幾種數據類型呢?數據結構
除了基本數據類型,萬物皆對象,記住這個很重要,這體現了js設計的哲學思想,和現實生活事物存在的關係如出一轍。prototype
接觸js也一年有餘了,剛開始看各類概念感受在記憶,先能上手幹活的感受也讓本身先用了js起來,回頭來看不少概念你不真正用的有些感悟可能真的很迷糊,就像今天忽然問本身__proto__ 是幹嗎的,和它長得很像的prototype又是幹嗎的,爲啥不都用一個,看起來讀起來都那麼像。。。。ok,我儘可能把本身所思所想記錄下來,能表達的清晰,哈哈其實我理解能力有限哈哈哈。設計
不讓本身思惟繞彎子,當咱們想徹底弄清楚一件事情的時候,那麼最好搞清楚咱們最關心的兩個問題:它是什麼,有什麼用,那麼先直接給幾個定論(若是有誤區請各位大神指正):3d
是什麼code
__proto__
每一個對象都擁有的屬性對象
prototype
每一個方法都擁有的屬性blog
有什麼用原型鏈
好了,先來講是什麼,那麼讓咱們想一想幾個關鍵字:每一個對象,每一個方法,那麼記得開始很重要的一件事兒麼,就是js中萬物皆對象,那麼方法是什麼鬼,沒錯,方法也是對象,一種須要特殊拎出來的對象,特殊在哪呢,那麼牛逼。。。。其實就是要理解是什麼中,方法比對象更牛逼一些,由於它既是對象又是方法。。。。因此呢?說明方法既有__proto__屬性又有prototype屬性。那麼咱們能夠開始看例子來加深理解:原型
var A = function(){}; // A是一個方法,固然也是個對象 var a = new A(); // a是一個由A創造出的對象,不是方法 //看一看對象非方法的行爲 console.log(a.__proto__); //object console.log(a.prototype); //undefined, 對象沒有 //看一看方法的行爲,方法也是對象哦 console.log(A.__proto__); //function console.log(A.prototype); //object
是否是有點暈了,哈哈我也是,別急至少咱們驗證了咱們是什麼的定論,接下來研究下有什麼用,其實在這以前難道很差奇a.__proto__,a.prototype, A.__proto__,A.prototype, 都等於誰嗎?那咱們來接着驗證。io
console.log(a.__proto__ === A.prototype); //true console.log(a.prototype === undefined); //true console.log(A.__proto__ === Function.prototype); //true console.log(A.prototype === a.__proto__); //true
矣,是否是看出來點神馬?沒錯,有一點點原型鏈的感受了,那麼繼續
//先看a這條鏈 console.log(a.__proto__.__proto__ === A.prototype.__proto__); //true console.log(a.__proto__.__proto__ === Object.prototype);//true console.log(a.__proto__.__proto__.__proto__ === Object.prototype.__proto__);//true console.log(a.__proto__.__proto__.__proto__ === null);//true //再看看A這條條鏈 console.log(A.__proto__.__proto__ === Function.prototype.__proto__);//true console.log(A.__proto__.__proto__ === Object.prototype);//true console.log(A.__proto__.__proto__.__proto__ === Object.prototype.__proto__);//true console.log(A.__proto__.__proto__.__proto__ === null);//true
矣,像不像兩個鏈條了?並且這兩個鏈條還有些關係呢,頭大?我也是。。要不來張圖吧
說明一下,這裏有兩類事物:對象和對象方法,對象方法是我起的名字。。。哈哈,記住方法也是對象,js萬物皆對象哦。其中紅色框是表示的原型對象,網上不少圖把它和擁有它的對象畫在一塊兒,我以爲不夠直觀,因此就本身畫出來啦,對照上面總結的是什麼和原型鏈的驗證,再配合這張圖,箇中體會,哈哈有木有豁然開朗的趕腳,若是沒有沒關係,多看幾遍嘍哈哈哈
而後咱們來看下,這張圖幾個有意思的地方。