原型鏈(Prototype Chain)是JavaScript中一個非常重要的概念,它決定了對象之間的繼承關(guān)系,理解它不僅能夠更好地理解JavaScript的面向?qū)ο筇匦裕€能夠幫助我們更好地使用JavaScript編寫程序。
在JavaScript中,每個對象都有一個屬性稱為__proto__,它指向該對象的原型(即該對象的父類),如果父類也有__proto__屬性,則會繼續(xù)向上查找,形成一個原型鏈,直至找到頂層的Object對象。
let a = {}; console.log(a.__proto__); // 輸出Object.prototype console.log(a.__proto__.__proto__); // 輸出null
上面的代碼中,a是一個空對象,它的原型指向Object.prototype,而Object.prototype沒有__proto__屬性,因此繼續(xù)向上查找得到null。
一個對象可以通過__proto__屬性顯式指定它的原型,這時候我們可以使用Object.create()方法來創(chuàng)建一個新的對象,同時指定它的原型:
let b = {}; let c = Object.create(b); console.log(c.__proto__); // 輸出b對象
上面的代碼中,創(chuàng)建了一個空對象b,然后使用Object.create()方法創(chuàng)建了一個新的對象c,并將c的__proto__屬性指向b。
當(dāng)我們對一個對象進(jìn)行屬性查找時,如果該對象沒有該屬性,則會向它的原型鏈中的下一個對象查找,如果還沒有則繼續(xù)向上查找,直至查找到頂層的Object對象。
let obj = {}; obj.toString(); // 查找到Object.prototype上的toString方法
上面的代碼中,調(diào)用obj的toString方法時,在obj自身找不到該方法,于是沿著obj的原型鏈向上查找,在Object.prototype上找到了它,最終調(diào)用了該方法。
原型鏈不僅僅是對象之間的繼承關(guān)系,它還決定了對象方法調(diào)用時的執(zhí)行順序,即在方法查找中所謂的“優(yōu)先級順序”,這個順序就是沿著原型鏈向上查找方法,并執(zhí)行最頂層的方法。
let a = {x: 1}; let b = Object.create(a); b.x = 2; console.log(b.x); // 輸出2 delete b.x; console.log(b.x); // 輸出1,沿著原型鏈找到了a.x
上面的代碼中,創(chuàng)建了一個a對象,它有一個屬性x,然后創(chuàng)建了一個b對象,并將其原型指向a,此時b對象繼承了a對象的x屬性,因此訪問b.x時輸出2。接著執(zhí)行了delete b.x,刪除了b自身的x屬性,再次訪問b.x時沿著原型鏈找到了a.x。
總之,原型鏈?zhǔn)荍avaScript中重要的概念,可以幫助我們更好地理解JavaScript面向?qū)ο缶幊痰奶匦裕部梢詭椭覀兏玫厥褂肑avaScript編寫程序。