Heim > Web-Frontend > js-Tutorial > Hauptteil

Wann sollten Sie „Child.prototype = Parent.Prototype' in der JavaScript-Vererbung vermeiden?

Patricia Arquette
Freigeben: 2024-11-14 10:28:02
Original
376 Leute haben es durchsucht

When Should You Avoid `Child.prototype = Parent.Prototype` in JavaScript Inheritance?

Wann man Child.prototype = Parent.Prototype in der JavaScript-Vererbung vermeiden sollte

Es ist zwar üblich, in JavaScript mit Child.prototype = zu erben new Parent();, es gibt Ausnahmen, bei denen Child.prototype = Parent.Prototype unbeabsichtigtes Verhalten verursachen kann.

Beachten Sie den folgenden Ausschnitt:

function GameObject(oImg, x, y) {

    this.x = x;
    this.y = y;
    this.img = oImg;

    this.hit = new Object();
    this.hitBox.x = x;
    this.hitBox.y = y;
    this.hitBox.width = oImg.width;
    this.hitBox.height = oImg.height;

}

Spaceship.prototype = new GameObject();
Spaceship.prototype.constructor = Spaceship;

function Spaceship(){
    console.log("instantiate ship");
    GameObject.apply(this, arguments);
    this.vx = 0;
    this.vy = 0;
    this.speed = 3;
    this.friction = 0.94;
}
Nach dem Login kopieren

Bei der Inspektion des Spaceship-Konstruktors werden Sie feststellen, dass Sie werden feststellen, dass die Eigenschaft __proto__ auf Spaceship und nicht auf GameObject verweist. Dies liegt daran, dass die Zeilen:

this.hitBox.width = oImg.width;
this.hitBox.height = oImg.height;
Nach dem Login kopieren

Eigenschaften direkt dieser.hitBox zuweisen, die im GameObject-Prototyp nicht vorhanden ist. Dieses Verhalten ist problematisch, weil es:

  • Vererbung unterbricht: Bei Verwendung von Child.prototype = Parent.Prototype erbt der untergeordnete Prototyp keine neuen Funktionen, die dem übergeordneten Prototyp hinzugefügt wurden.
  • Verstößt gegen die Instanzprüfung: Da das __proto__ der Spaceship-Instanz auf Spaceship statt auf GameObject zeigt, schlägt die Prüfung, ob (Objektinstanz von GameObject) fehl.

Warum Child.prototype = new Parent() verwenden? ; Stattdessen

Child.prototype = new Parent(); ruft den Konstruktor der Parent-Klasse auf und weist seine neu erstellte Instanz dem Child-Prototyp zu. Dadurch wird sichergestellt, dass:

  • Vererbung erhalten bleibt: Alle neuen Funktionen, die dem übergeordneten Prototyp hinzugefügt werden, werden automatisch vom untergeordneten Element geerbt.
  • Instanzprüfungen sind korrekt: Das __proto__ der untergeordneten Instanz zeigt auf den übergeordneten Prototyp und ermöglicht so die korrekte Instanz der Prüfung.

Alternative Lösung

In modernen Browsern, die Object.create unterstützen, können Sie Spaceship.prototype verwenden = Object.create(GameObject.prototype); um den untergeordneten Prototyp zu erstellen. Dies entspricht funktional Child.prototype = new Parent(); ist aber prägnanter und vermeidet den unnötigen Konstruktoraufruf.

Das obige ist der detaillierte Inhalt vonWann sollten Sie „Child.prototype = Parent.Prototype' in der JavaScript-Vererbung vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage