簡單描述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__是所有的對象都擁有的屬性,但是這個屬性被廢棄不提倡使用了。
執行個體一:
var A = function () { this.name = "a"; } var B = {} console.log(A.prototype); console.log(B.prototype);//prototype是函數的屬性,所以這裡列印undefined,大家也就不會奇怪了吧。 console.log(B.constructor.prototype); console.log(A.__proto__); console.log(B.__proto__);
結果如下:
原型鏈
在js執行過程如果當前使用中的物件沒有這個屬性,那js執行引擎會按照該對象的__proto__屬性一直向上級尋找,直到Object.__proto__,如果還是沒有發現則會返回undefined。上一張圖看看到底是如何尋找的。
Javascript建立對象的步驟
Javascript建立對象的步驟:(1)、建立新對象;(2)、將該對象的原型指向建構函式prototype所指向的那個原型對象;(3)、將該對象作為this參數調用建構函式。如下:
function Obj() { } var o = {}; Obj.call(o)