標籤:tor log 類型 執行個體 logs type ima eof 對象
在清楚了js建立對象和new方法的過程之後,再來看原型的概念就容易理解多了。
原型存在的目的是為了能更加節約記憶體地繼承。
我認為原型中主要需要搞清楚這4個概念,顯式原型指向什麼,隱式原型指向什麼,constructor指向什麼,原型鏈是什麼。
一圖勝千言。下面這張圖就解釋了所有這些概念。
下面自己總結了一些原型的基本特徵,用於加深理解:
1. 在JS裡,萬物皆對象。方法(Function)是對象,方法的原型(Function.prototype)是對象。因此,它們都會具有對象共有的特點。
即:對象具有屬性__proto__,可稱為隱式原型,一個對象的隱式原型指向構造該對象的建構函式的原型,這也保證了執行個體能夠訪問在建構函式原型中定義的屬性和方法。ES5中有了對於這個內建屬性標準的Get方法Object.getPrototypeOf().
2. 方法(Function)這個特殊的對象,除了和其他對象一樣有上述__proto__屬性之外,還有自己特有的屬性——原型屬性(prototype),這個屬性是一個指標,指向一個對象,這個對象的用途就是包含所有執行個體共用的屬性和方法(我們把這個對象叫做原型對象)。原型對象也有一個屬性,叫做constructor,這個屬性包含了一個指標,指回原建構函式。
3. 所有對象都是由函數建立的。註:{}會比new Object()效率快。
4. 函數對象的隱式原型(__proto__)指向Function.prototype。
5. 函數對象的顯式原型(prototype)的隱式原型(__proto__)指向Object.prototype。
6. 非函數對象的隱式原型(__proto__)指向其建構函式的prototype屬性指向的對象。
7. Object.prototype.__proto__ 指向 null。
8. Function的隱式原型(__proto__)指向Function.prototype,因為Function也是函數對象。
9. 對象都是參考型別,因此顯式原型(prototype)和隱式原型(__proto__)也是參考型別,因此父級(或父級的父級,或更高)建構函式的prototype修改添加屬性時會直接影響到其子級(以及子級和子級,和更低)。
參考連結: https://www.zhihu.com/question/34183746/answer/58155878
js原型和原型鏈知識整理