Zuerst ein Code zum Einstellen der Bühne:
%Vor% Die Idee ist, dass es eine Klasse Parent
gibt, die mehrere Child
-Klassen umfassen. Die Initialisierung der Child
-Klassen ist meistens gleich, aber jede hat ihre eigene Implementierung von doImportantStuff()
, deren Rückgabewert angibt, ob diese bestimmte Child
instanziiert werden soll.
Bisher hat das in jedem transpiler funktioniert, den ich probiert habe, weil this
in der Funktion Parent.init()
sich auf den Konstruktor der Klasse Child
bezieht. Ich habe jedoch keine Dokumentation gefunden, die auf die eine oder andere Weise von einer statischen Methode spricht, die von einer Kindklasse überschrieben wurde. Die Frage ist also: Kann ich darauf vertrauen, dass dies immer so ist? Oder gibt es eine andere Möglichkeit, dies zu tun?
Ich habe jedoch keine Dokumentation gefunden, die auf die eine oder andere Weise von einer statischen Methode spricht, die von einer untergeordneten Klasse überschrieben wird. Daher lautet die Frage: Kann ich darauf vertrauen, dass dies immer so ist?
Dies ist der Standardfunktionsaufruf-über-Objekt-Eigenschaft-Mechanismus. Wenn du es tust:
%Vor% ... es sei denn, doImportantStuff
ist eine Pfeilfunktion (ist es nicht) oder eine gebundene Funktion (ist es nicht), dann wird während des Aufrufs this
auf Child1
gesetzt. Genau wie:
Also, darauf können Sie sich verlassen. (Und ich verstehe, warum Sie gefragt haben, es erscheint etwas merkwürdig, wenn Sie es nicht durcharbeiten.)
Natürlich funktioniert es nicht innerhalb des Codes einer nicht static
-Funktion, weil this
sich auf die Instanz und nicht auf die Konstruktorfunktion bezieht. Wenn Sie es dort benötigen, können Sie this.constructor.doImportantStuff
verwenden, es sei denn, jemand hat die Eigenschaft constructor
durcheinander gebracht. (Die Leute haben es immer vermasselt; mit der neuen Syntax, die es automatisiert, wird das hoffentlich weniger passieren, obwohl es selten ist, dass du es wirklich brauchst ...)
Für diese Art von Fragen ist es oft nützlich, sich daran zu erinnern, dass die neue Klassensyntax fast ist, nur syntaktischer Zucker für die alte ausführliche Art, wie wir es gemacht haben (wenn wir wirklich gründlich waren). Es ist wirklich gut Zucker, aber das ist fast alles, was es ist (und das ist ein gutes Ding ™). static
-Methoden werden als Eigenschaften der Konstruktorfunktion festgelegt, nicht static
-Methoden werden als Eigenschaften des Objekts in der prototype
-Eigenschaft des Konstruktors eingerichtet. (Ich denke, der einzige Nicht-Zucker-Aspekt ist, wie Bergi darauf hinweist, dass die neue Syntax es uns erlaubt, Builtins zu erweitern wie Array
, was vorher nicht möglich war, hängt davon ab, wie und wann this
eingerichtet wird [vor dem Aufruf von super()
im Unterklassenkonstruktor kann nicht darauf zugegriffen werden], Das bezieht sich auf new.target
, die Bergi hier diskutiert . In ES7 kann es mit Privacy-Sachen noch weiter gehen.)
Wenn Sie nicht
anrufen möchten %Vor% in Parent
, aber rufen Sie dynamisch die überschriebene statische Methode auf, Sie können Folgendes tun:
Dies funktioniert auch für Setter und im Konstruktor der Elternklasse:
Tags und Links javascript ecmascript-6