1.原型(公用屬性)
首先,我們來講講瀏覽器的初始狀態,就是在無代碼的情況下,瀏覽器所分配到的內存的使用情況,首先瀏覽器會創建一個全局對象global,而在這個全局對象global內含有許多的全局函數,例如global.parseInt、global.parseFloat、global.Number、global.String、global.Boolean、global.Object等等,函數也是對象的一種,因此也會具有屬性,其中一種屬性為`prototype`,這個屬性的含義便是函數的原型對象。
另一方面,通過這些函數如Number()、String()、Object()所構建出來的對象,都會擁有著一個屬性`__proto__`,這個屬性的value指向創建該對象的構造函數的原型對象,如:
var a=new Number(1)
a.__proto__===Number.prototype
除函數Object以外的其他函數的原型對象在最后均會通過`__proto__`指向函數的原型對象,即`Object.prototype`,而函數Object的原型對象最后會通過`__proto__`指向`null`。
***總之,所有的對象都有`__proto__`屬性,而只有函數有`prototype`屬性。***
另外,這里說的指向并不是說使用指針,而是引用的意思。
2.原型鏈
在簡單介紹了原型之后,我們可以和上面說法一樣進行畫圖,便會構造出許許多多像鏈條一般的模型,這種模型稱為原型鏈,具體畫圖如下:
image
關于原型鏈,你需要的知道的是:
var XXX=new YYY()
XXX的類型是對象,即'object',YYY的類型是函數對象。
即:對象.__proto__===函數.prototype
這條等式適用于所有的原型鏈,兩邊都指向同一個對象,或者說是同一個對象的引用。
于是乎,我們就能拓展出下面的等式:
①函數.prototype.__proto===Object.prototype
(這條等式成立的原因,是因為函數的原型對象也是一個普通的對象,因此它的原型等于它的構造函數的原型對象,即Object.prototype
)
②函數.__proto__===Function.prototype
(通過typeof可知函數的類型是'Function',即有var f=new Function()
,所以有此等式,當然,函數也是對象的一種)
③Function.__proto__===Function.prototype
(這條等式成立的原因,是因為Function本身也是函數,因此Function.__proto__
和Function.prototype
指向同一個Function原型對象)
④Function.prototype.__proto__===Object.prototype
(這條等式成立的原因,正如在介紹原型的時候所說:除函數Object以外的其他函數的原型對象在最后均會通過__proto__
指向函數的原型對象,即Object.prototype
)