Javascript 繼承的細微差別:Child.prototype = Parent.Prototype 與Child.prototype = new Parent()
在Javascript 中,Java繼承通常使用原型機制來實現。這兩種常見方法之間的關鍵差異在於它們對子物件的 proto 屬性的影響。
當使用 Child.prototype = Parent.Prototype 時,子原型和父原型都指向同一個物件。這意味著對子級原型所做的任何更改也會影響父級原型。
但是,當使用 Child.prototype = new Parent() 時,會建立一個繼承自父級原型的新物件。這可確保子級原型與父級原型隔離,從而允許獨立修改而不影響父級。
對實例屬性的影響
在提供的範例中,問題在子建構子中設定實例屬性時會出現:
this.hitBox.width = oImg.width; this.hitBox.height = oImg.height;
使用Child.prototype = Parent.Prototype,這些屬性將直接添加到子級的原型中,該原型也是父級的原型。結果,子建構函式中的 console.log(this) 顯示 proto: Spaceship 因為原型現在設定為 Spaceship。
解決方案:使用Object.create
為了避免這個問題,建議使用Object.create(Parent.prototype):
Spaceship.prototype = Object.create(GameObject.prototype);
此策略建立一個繼承自父級原型的新對象,同時保持自己獨立的原型。新增到子級原型的實例屬性不會影響父級原型。
與instanceof的比較
在使用物件instanceof GameObject檢查繼承的情況下,重要的是請注意,Child.prototype = Parent.Prototype 將無法通過此測試,因為子級的原型不是GameObject 的實例。相比之下,Child.prototype = new Parent() 將按預期通過測試。
推薦
對於Javascript 中健壯且隔離的繼承,通常首選使用Child.prototype = Object.create(Parent.prototype) 而不是Child.prototype = Parent .Prototype.
以上是JavaScript 繼承:Child.prototype = Parent.Prototype 與 Child.prototype = new Parent() - 哪一種方法比較好?的詳細內容。更多資訊請關注PHP中文網其他相關文章!