在 JavaScript 中,繼承是透過原型繼承實現的,其中物件透過原型鏈從其他物件繼承屬性和方法。構造函數屬性在這個機制中扮演著至關重要的角色。
繼承與建構子屬性
考慮下面的程式碼:
function a() {} function b() {} function c() {} b.prototype = new a(); c.prototype = new b(); console.log((new a()).constructor); //a() console.log((new b()).constructor); //a() console.log((new c()).constructor); //a()
為什麼不是b 和 c 的建構子沒有更新嗎?這是因為在 JavaScript 中,建構函式屬性不會直接指派給實例;相反,它駐留在原型物件上。它儲存對創建該物件的建構函數的參考。在上面的範例中,b 和 c 的原型設定為 a 的實例,這就是為什麼所有三個實例的建構子都會報告為 a()。
更新建構子的最佳實務
要更新繼承類別的建構子屬性,常見的方法是使用中間function:
function base() {} function derive() { derive.superclass = base.prototype; derive.prototype = new derive.superclass(); derive.prototype.constructor = derive; }
此技術確保衍生實例的建構子屬性正確設定為衍生函數。
Instanceof 和原型鏈
雖然(new c()).constructor 等於a(),instanceof 仍然可以正確地將new c() 識別為c 的一個實例。這是因為instanceof會檢查實例物件的原型鏈。在這種情況下,new c() 的原型鏈會回到 c 原型。
console.log(new a() instanceof a); //true console.log(new b() instanceof b); //true console.log(new c() instanceof c); //true
結論
JavaScript 的繼承和建構函數屬性互動可以是複雜,但理解它們對於 JavaScript 中有效的物件導向程式設計至關重要。透過掌握本文概述的概念,您可以編寫健壯且可重複使用的程式碼,有效地利用繼承和原型鏈。
以上是為什麼 JavaScript 的建構子屬性在原型繼承中不更新?的詳細內容。更多資訊請關注PHP中文網其他相關文章!