ES6 - Statische Methode innerhalb einer Klasse aufrufen

80

Ich habe diese Klasse, die einen internen Aufruf einer statischen Methode ausführt:

export class GeneralHelper extends BaseHelper{
     static is(env){
          return config.get('env:name') === env;
     }

     static isProd(){
         return GeneralHelper.is('prod');
     }
 }

Gibt es Schlüsselwörter, mit denen ich den Klassennamen in der folgenden Zeile ersetzen kann:

GeneralHelper.is('prod');

In PHP gibt es self, staticusw. alles bieten Does ES6 ähnlich wie diese?

TY.

Shlomi
quelle
Ich habe eine komplexere Antwort in einem separaten Thread zu diesem Problem veröffentlicht: stackoverflow.com/a/43694337/3182819
Thomas Urban

Antworten:

74

Wenn Sie die statische Funktion innerhalb einer Instanz aufrufen, können Sie wie folgt auf die statische Klassenfunktion verweisen:

this.constructor.functionName();

es6 ruft statische Methoden auf

Otto Nascarella
quelle
9
OP fragt nicht nach dem Aufruf von einer Instanz. (Wenn er es wäre, wäre es ein Duplikat der Frage, die Sie verlinkt haben)
Bergi
Das ist nicht einmal eine Antwort. this.constructor.is('prod')würde in diesem Fall Fehler werfen.
UtkarshPramodGupta
Dies ist die Lösung, wenn Sie Ihre statische Methode aufrufen möchten, wenn Sie sich in einer instanziierten Klasse befinden. Andernfalls rufen Sie einfach auf this.method(). Auch wenn Sie eine Klasse erweitern, rufen Sie ansuper.method()
52

Es ist dasselbe wie das Aufrufen einer Methode für ein gewöhnliches Objekt . Wenn Sie die GeneralHelper.isProd()Methode aufrufen , ist die GeneralHelperwie thisin der Methode verfügbar , sodass Sie sie verwenden können

class GeneralHelper {
     static is(env) { … }
     static isProd(){
         return this.is('prod');
     }
}

Dies funktioniert jedoch nicht, wenn die Methode wie gewohnt als Rückruffunktion weitergegeben wird . Es kann sich auch vom GeneralHelperexpliziten Zugriff unterscheiden, wenn jemand isProdvon Ihrer Klasse erbt und überschreibt isund InheritedHelper.isProd()andere Ergebnisse erzielt.

Wenn Sie statische Methoden von Instanzmethoden aufrufen möchten, lesen Sie hier . Beachten Sie auch, dass eine Klasse, die nur statische Methoden definiert, eine Sonderklasse ist. Möglicherweise möchten Sie stattdessen ein einfaches Objekt verwenden.

Bergi
quelle
16
Ich denke, es ist ziemlich verwirrend, "dieses" Schlüsselwort in einem statischen Kontext zu verwenden, aber trotzdem funktioniert es gut, danke
Shlomi
6
Ja, in PHP $ bezieht sich dies auf das aktuelle Objekt, in dem Sie sich befinden. In der Klasse 'Methoden (statisch) ist dieses Schlüsselwort nicht vorhanden (Sie haben' self 'und das neueste' static '). Soweit ich mich erinnere, ist auch in Java "dieses" Schlüsselwort für eine statische Methode nicht verfügbar - und es ist sinnvoll: Es gibt keine "diese" Entität, wenn Sie sich in einem statischen Kontext befinden. "Dies" muss besprochen werden bestimmte Entität und in statische Methode beziehen Sie sich für die gesamte Klasse oder für allgemeine Aktionen ..
Shlomi
10
Als JS-Entwickler ist es sehr wichtig zu verstehen, wie thissich das Verhalten verhält. Es funktioniert nicht wie thisin anderen Sprachen.
Loganfsmyth
1
@kidwon: Ein Konstruktoraufruf ähnelt einem Methodenaufruf, ist also derselbe wie dort (mit dem einzigen Unterschied this, dass er vor dem Superaufruf nicht verwendet werden kann).
Bergi
1
@ Kindwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani
33

Beide Antworten hier sind richtig und gut, aber ich wollte basierend auf diesem Fragentitel ein zusätzliches Detail hinzufügen.

Als ich "ES6 - Statische Methode innerhalb einer Klasse aufrufen" sah, klang es wie "eine statische Methode (von einer nicht statischen Methode) innerhalb einer Klasse aufrufen". Definieren Sie nicht, was der ursprüngliche Fragesteller im Detail stellt.

Aber für alle, die wissen möchten, wie eine statische Methode von einer nicht statischen Methode innerhalb einer Klasse aufgerufen wird, können Sie dies folgendermaßen tun:

class MyClass {
    myNonStaticMethod () {
        console.log("I'm not static.")
        MyClass.myStaticMethod()
    }

    static myStaticMethod () {
        console.log("hey, I'm static!")
    }
}

MyClass.myStaticMethod() // will log "hey, I'm static!"

const me = new MyClass()

me.myNonStaticMethod() // will log "I'm not static" and then "hey, I'm static!"

Die Idee ist, dass die statische Methode aufgerufen werden kann, ohne eine neue Instanz der Klasse zu erstellen. Das heißt, Sie können es innerhalb der Methode einer Instanz genauso aufrufen, wie Sie es außerhalb der Instanz aufrufen würden.

Wiederum weiß ich, dass dies nicht das Detail der Frage war, aber dies könnte anderen Menschen helfen.

Chris Schmitz
quelle