JavaScript 的原型詳解
簡單描述js原型
原型提供了一群同類對象共享屬性和方法的機制,對象繼承原型的所有屬性和方法(函數)。說白了js是使用原型來實現類繼承的。
充分理解prototype / __proto__
初學者確實在這兩個屬性上是不容易分辨清楚地。所以,一個搞前端的朋友說,這兩個屬性完全搞明白了,那js原型也就差不多理解透徹了。那我嘗試闡述一下這兩個屬性(內容總結自他人的結晶和js文檔)。
prototype:prototype是函數的屬性,它應用的場合是函數被用作構造函數時,如果你想讓子類擁有某型特性,那我們可以直接操作父類(總是感覺父函數貼切)的這個prototype。所以在js的繼承中prototype是父類構造函數的一個屬性,這個屬性指向被構造函數創建的對象(一定要注意prototype是函數的屬性,而不是對象的)
__proto__:在創建對象的過程中__proto__屬性會指向構建這個對象的函數的prototype屬性。Eg:var a = new Function(); a.__proto__ === Function.prototype。__proto__是所有的對象都擁有的屬性,但是這個屬性被廢棄不提倡使用了。
實例一:
結果如下:
原型鏈
在js執行過程如果當前活動對象沒有這個屬性,那js執行引擎會按照該對象的__proto__屬性一直向上級查找,直到Object.__proto__,如果還是沒有發現則會返回undefined。上一張圖看看到底是如何尋找的。
Javascript創建對象的步驟
Javascript創建對象的步驟:(1)、創建新對象;(2)、將該對象的原型指向構造函數prototype所指向的那個原型對象;(3)、將該對象作為this參數調用構造函數。如下:
function Obj() {
}
var o = {};
Obj.call(o)