了解 JavaScript 中的繼承和建構函式屬性
提供的程式碼片段示範了 JavaScript 中的繼承。然而,它也引發了關於建構子屬性和instanceof運算子的問題。
為什麼b和c的建構子屬性沒有更新?
當將b.prototype設定為new a(),a的原型物件變成b的原型。這不會更新 b 的建構子屬性,它仍然是函數 b。同樣,c繼承自b,因此也繼承了b的構造函數,最終指向a。
繼承機制是否有問題?
沒有,繼承機制是正確的。在 JavaScript 中,建構函式屬性是原型物件的屬性,而不是實例本身的屬性。建立實例時,內部 [[proto]] 屬性指向建構子的原型,而不是建構子本身。
更新建構子屬性
至更新建構子屬性,可以使用以下模式:
function Square(side) { if (this instanceof Square) { this.side = side; } else { return new Square(side); } }
理解instance
instanceof 運算子不依賴實例的建構子屬性。相反,它檢查實例物件的原型鍊是否包含建構函數的原型。在給定的程式碼中:
c.prototype = new b(); console.log(new c() instanceof c); // true
即使(new c()) 的建構子屬性指向a(),instanceof 也會檢查原型鏈並正確地將其識別為c 的實例,因為原型鏈包括c.prototype。
結論
JavaScript 中的繼承涉及設定原型派生建構函數到基底建構子的實例。建構子屬性仍然是原型物件的屬性,instanceof 運算子檢查原型鏈以確定實例是否屬於特定建構子。
以上是為什麼JavaScript的繼承機制不會自動更新建構函式屬性?的詳細內容。更多資訊請關注PHP中文網其他相關文章!