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; }
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;
Eigenschaften direkt dieser.hitBox zuweisen, die im GameObject-Prototyp nicht vorhanden ist. Dieses Verhalten ist problematisch, weil es:
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:
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!