2017-07-03 1 views
0

Ich bekomme einen undefinierten Wert beim Aufruf rnd.winner() in der untergeordneten Klasse. Dies sollte den Namen des Spielers von Eltern wie JOHN zurückgeben. Der Aufruf der Testfunktion von Kind gibt den korrekten Wert win() von Eltern zurück. Aufruf von super.constructor.name als Rückgabestatus in Kind gibt Eltern Klassenname ->player Nun, warum ist das?JS class child returns undefined beim Zugriff auf den übergeordneten Konstruktor

class player { 
 
    constructor(name) { 
 
    this.name = name; 
 
    this.win = 0; 
 
    this.loss = 0; 
 
    }; 
 
    win() { 
 
    return this.win; 
 
    }; 
 
    loss() { 
 
    return this.loss; 
 
    }; 
 
}; 
 

 
class scoreBoard extends player { 
 
    constructor(round) { 
 
    super(); 
 
    this.round = round; 
 
    this.emblem = 0; 
 
    }; 
 
    add() { 
 
    return this.round.push([...this.round].pop() + 1); 
 
    } 
 
    winner() { 
 
    return super.name; 
 
    }; 
 
    loser() { 
 
    return super.constructor.name; 
 
    }; 
 
    emblem() { 
 
    return this.emblem; 
 
    }; 
 
    test() { 
 
    return super.win(); 
 
    }; 
 
}; 
 
let plr = new player("JOHN"), 
 
    rnd = new scoreBoard([0]); 
 
console.log(plr.name, rnd.winner(), rnd.test());

+0

Verwenden Sie nicht 'super' mit reinen Dateneigenschaften. Sie existieren immer auf Ihrer aktuellen Instanz. Verwenden Sie stattdessen 'this.name'. – Bergi

+1

Warum glauben Sie, dass ein "scoreBoard" eine Erweiterung eines 'players' ist? Ich verstehe die Logik nicht wirklich. Für ein Scoreboard (mit Gewinner- und Verlierer-Methode) brauchst du mindestens zwei Spieler, damit ich nicht sammle, was du dir in der Erbschaftsbeziehung erhofft hast. Und warum ist ein Array "rund"? 'constructor.name' hat * nichts * mit Ihrer' name' Eigenschaft zu tun. Es ist eine vordefinierte Eigenschaft von Funktionen (da "Konstruktor" eine Funktion ist). – trincot

Antwort

0

Aufruf super.constructor.name wie in Kind Rückgabestatus Eltern Klassennamen zurückgibt (player). Nun, warum ist das so?

Weil das ist, was super tut. Es übernimmt nicht die eigene constructor Eigenschaft, sondern die constructor Eigenschaft für das Objekt, von dem Sie erben. Für scoreBoard.prototype Methoden ist das player.prototype Objekt, und .constructor.name ist "player".

Es gibt keinen Grund, super überhaupt zu verwenden, außer Sie überschreiben eine geerbte Methode (oder den Konstruktor). Dies bedeutet, dass super niemals mit reinen Dateneigenschaften verwendet werden soll. Sie existieren immer auf Ihrer aktuellen Instanz. Verwenden Sie stattdessen this.….

Ich bekomme undefined Wert beim Aufruf rnd.winner() in der Unterklasse. Dies sollte den Namen des Spielers von Eltern wie JOHN zurückgeben.

Das ist, weil .name nicht initialisiert wurde, als Ihr Kind Klasse kein Argument bis zum Mutter Konstruktor in super() bestanden hat. In der Tat, Ihre rnd weiß nicht über die plr Instanz überhaupt.

In jedem Fall scheint Vererbung das falsche Werkzeug zu sein, um die Beziehung zwischen einem Spieler und einem Anzeiger zu beschreiben. Use composition instead - z.B. die Anzeigetafel, die ein Array von anzuzeigenden Spielerobjekten enthält.

+0

Naja, wenn ich etwas wie 'super (plr.name);' (was mir total inkorrekt aussieht) und 'return this.name' zurückliefern, gibt es schließlich den richtigen Namen. Jetzt ist es für mich klar, ich werde arbeiten und einen guten Weg finden, mit "diesem" umzugehen! – NightKn8

+0

Ja, das ist ein Weg, um es zum Laufen zu bringen, und ja, es ist völlig falsch, da eine Anzeigetafel kein Spieler ist. – Bergi

Verwandte Themen