首頁  >  文章  >  web前端  >  JavaScript 繼承:Child.prototype = Parent.Prototype 與 Child.prototype = new Parent() - 哪一種方法比較好?

JavaScript 繼承:Child.prototype = Parent.Prototype 與 Child.prototype = new Parent() - 哪一種方法比較好?

Barbara Streisand
Barbara Streisand原創
2024-11-17 15:46:01277瀏覽

JavaScript Inheritance: Child.prototype = Parent.Prototype vs. Child.prototype = new Parent() - Which Approach is Better?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn