2016-12-27 5 views
2

Lesen Dr. Axel Rauschmayer's blog on ES6 classes, ich verstehe, dass eine abgeleitete Klasse die folgende Standard-Konstruktor hat, wenn keineWann muss ich `super` von einem Konstruktor aufrufen?

constructor(...args) { 
    super(...args); 
} 

auch vorgesehen ist, verstehe ich, dass, wenn ich this in einem Konstruktor verwenden möchten this werde ich brauchen, um erste super zu nennen, sonst noch nicht initialisiert (ReferenceError werfen).

constructor(width, height) { 
    this.width = width; // ReferenceError 
    super(width, height); 
    this.height = height; // no error thrown 
    ... 
} 

Ist die folgende Annahme dann richtig? (Und wenn nicht, könnten Sie bitte die Bedingungen erläutern, unter denen ich ausdrücklich super nennen sollte)

für abgeleitete Klassen, ich brauche nur ausdrücklich super rufen, wenn ...

  1. Ich muss für den Zugriff auf this aus im Konstruktor
  2. der Oberklassenkonstruktors erfordert unterschiedliche Argumente dann die abgeleitete Klasse Konstruktor

anderen Zeiten sind da, wenn ich einen Anruf enthalten sollte zum Superklassenkonstruktor?

+0

Nein, gibt es nicht. Welche Art von "Beweis" willst du für diese Aussage? –

+0

Wenn Sie eine Klasse wie 'Klasse ABC erweitern DEF {...' machen, dann müssen Sie 'Super (...args); ', weil Sie gerade mit' extends DEF' angegeben haben, dass Sie daraus ableiten wollen. Wenn Sie nicht von irgendeiner Klasse abgeleitet sind, dann setzen Sie nicht einfach 'super' in den ABC-Konstruktor. So einfach ist das. – Azamantes

+1

@Azamantes: Es ist nicht notwendig, 'super' aufzurufen, wenn die Elternklasse dieselben Argumente wie die Kindklasse annimmt. –

Antwort

5

Ja, das klingt korrekt, wenn auch ein bisschen seltsam formuliert. Die Regeln sollten

  • In einer abgeleiteten Klasse sein, Sie immer Notwendigkeit, die super(…) Konstruktor
  • anrufen Wenn Sie nicht mehr als die Standard-Konstruktor zu tun, können Sie die ganze constructor(){}, lassen was wiederum dazu führt, dass Ihr Klassencode keinen Super-Call enthält.

1: Sie brauchen nicht in dem verdächtigen Randfall ausdrücklich zu nennen return ein Objekt ing, die man kaum jemals tun würde.

1

Sie benötigen super in einer Unterklasse Konstruktor in diesen Fällen zu nennen:

  • Sie wollen this in der Unterklasse Konstruktor Referenz
  • Sie haben nicht ein anderes Objekt in der Unterklasse Konstruktor zurückgeben

In anderen Fällen können Sie es aufrufen, wenn der Superklassenkonstruktor ausgeführt werden soll, aber Sie müssen nicht.

class SuperClass{ 
 
    constructor() { 
 
    console.log('SuperClass'); 
 
    } 
 
} 
 
class SubClass1 extends SuperClass { 
 
    constructor() { 
 
    console.log('SubClass1'); 
 
    super(); 
 
    return {}; 
 
    } 
 
} 
 
class SubClass2 extends SuperClass { 
 
    constructor() { 
 
    console.log('SubClass2'); 
 
    return {}; 
 
    } 
 
} 
 
new SubClass1(); 
 
new SubClass2();

Ich sehe nicht, wie die Reihenfolge der Argumente zählt, wenn die Entscheidung, ob Sie super oder nicht nennen sollten.

+0

wenn ich irgendwo in der Unterklasse auf 'this 'verweisen möchte? oder irgendwo im Unterklassenkonstruktor? – sfletche

+0

@sfletche ja, er meint den Konstruktor – Bergi

+0

@sfletche Die anderen Dinge in einer Klasse sind nur Methoden, ich meinte den Konstruktor, ja. – Oriol

Verwandte Themen