本篇文章將簡單介紹一下原型以及原型鏈的概念。
1.原型(公用屬性)
????首先,我們來講講瀏覽器的初始狀態(tài),就是在無代碼的情況下,瀏覽器所分配到的內(nèi)存的使用情況,首先瀏覽器會創(chuàng)建一個全局對象global,而在這個全局對象global內(nèi)含有許多的全局函數(shù),例如global.parseInt、global.parseFloat、global.Number、global.String、global.Boolean、global.Object等等,函數(shù)也是對象的一種,因此也會具有屬性,其中一種屬性為prototype,這個屬性的含義便是函數(shù)的原型對象。
????另一方面,通過這些函數(shù)如Number()、String()、Object()所構(gòu)建出來的對象,都會擁有著一個屬性__proto__,這個屬性的value指向創(chuàng)建該對象的構(gòu)造函數(shù)的原型對象,如:
var a=new Number(1)
a.__proto__===Number.prototype
????除函數(shù)Object以外的其他函數(shù)的原型對象在最后均會通過__proto__指向函數(shù)的原型對象,即Object.prototype,而函數(shù)Object的原型對象最后會通過__proto__指向null。
????總之,所有的對象都有__proto__屬性,而只有函數(shù)有prototype屬性。
????另外,這里說的指向并不是說使用指針,而是引用的意思。
2.原型鏈
????在簡單介紹了原型之后,我們可以和上面說法一樣進(jìn)行畫圖,便會構(gòu)造出許許多多像鏈條一般的模型,這種模型稱為原型鏈,具體畫圖如下:

關(guān)于原型鏈,你需要的知道的是:
var XXX=new YYY()
XXX的類型是對象,即'object',YYY的類型是函數(shù)對象。
即:對象.__proto__===函數(shù).prototype
這條等式適用于所有的原型鏈,兩邊都指向同一個對象,或者說是同一個對象的引用。
于是乎,我們就能拓展出下面的等式:
①函數(shù).prototype.__proto===Object.prototype
(這條等式成立的原因,是因為函數(shù)的原型對象也是一個普通的對象,因此它的原型等于它的構(gòu)造函數(shù)的原型對象,即Object.prototype)
②函數(shù).__proto__===Function.prototype
(通過typeof可知函數(shù)的類型是'Function',即有var f=new Function(),所以有此等式,當(dāng)然,函數(shù)也是對象的一種)
③Function.__proto__===Function.prototype
(這條等式成立的原因,是因為Function本身也是函數(shù),因此Function.__proto__和Function.prototype指向同一個Function原型對象)
④Function.prototype.__proto__===Object.prototype
(這條等式成立的原因,正如在介紹原型的時候所說:除函數(shù)Object以外的其他函數(shù)的原型對象在最后均會通過__proto__指向函數(shù)的原型對象,即Object.prototype)