2015-06-29 21 views
37

Ich habe diese Klasse, die einen internen Aufruf eine statische Methode funktioniert:ES6 - Aufruf statische Methode innerhalb einer Klasse

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 ich die Klassennamen in der Zeile kann unten ersetzen:

GeneralHelper.is('prod'); 

In PHP gibt es self, static usw. Entspricht ES6 etwas ähnliches?

TY.

+0

Ich habe eine komplexere Antwort in einem separaten Thread zu diesem Thema geschrieben: http://Stackoverflow.com/a/43694337/3182819 – cepharum

Antwort

25

Es ist das gleiche wie calling a method on an ordinary object. Wenn Sie die GeneralHelper.isProd() Methode aufrufen, wird die GeneralHelper als this bei dem Verfahren zur Verfügung stehen, so können Sie

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

Diese verwenden jedoch nicht, wenn die Methode, um als Callback-Funktion, just as usual geben wird. Es kann auch anders sein, als explizit auf GeneralHelper zuzugreifen, wenn jemand isProd von Ihrer Klasse erbt und is, InheritedHelper.isProd() überschreibt, werden andere Ergebnisse erzeugt.

Wenn Sie statische Methoden von Instanzmethoden aufrufen möchten, finden Sie weitere Informationen unter here. Beachten Sie auch, dass eine Klasse, die nur statische Methoden definiert, ein Sonderfall ist. Sie sollten stattdessen ein einfaches Objekt verwenden.

+12

Ich denke, es ist ziemlich verwirrend verwenden "dieses" Schlüsselwort in einem statischen Kontext, aber trotzdem es funktioniert gut, danke –

+0

@ShlomiSasson: Warum? 'this' ist das Klassenobjekt, auf dem die Methode aufgerufen wurde, ziemlich Standard ... Ist das in anderen Sprachen sehr unterschiedlich? – Bergi

+6

Ja, in PHP $ bezieht sich dies auf das aktuelle Objekt innerhalb dessen Methode, in Klassenmethoden (statisch) Sie haben dieses Schlüsselwort nicht vorhanden (Sie haben 'selbst' und das neueste 'statisch'). Soweit ich mich erinnere, auch in Java "dieses" Schlüsselwort ist nicht verfügbar in einer statischen Methode - und es ist sinnvoll: es gibt keine "diese" Einheit, wenn Sie in einem statischen Kontext sind .. "dies" muss Sprechen Sie über bestimmte Entität und in statische Methode, die Sie für die gesamte Klasse oder für allgemeine Aktionen beziehen. –

23

, wenn Sie die statische Funktion von innen eine Instanz nennend, der richtige Weg, um die Klasse statische Funktion zu beziehen ist:

this.constructor.functionName();

es6 call static methods

+0

Die korrekteste, einfachste und beste Antwort. – heisian

+0

OP fragt nicht nach dem Aufruf von einer Instanz. (Wenn er es wäre, wäre es ein Duplikat der Frage, die du verlinkt hast) – Bergi

1

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

Als ich "ES6 - Call statische Methode innerhalb einer Klasse" sah es klang wie "rufen Sie eine statische Methode (von einer nicht-statischen Methode) innerhalb einer Klasse". Def nicht, was der ursprüngliche Fragesteller in den Details fragt.

Aber für jeden, der wissen will, wie man es so tun kann, innerhalb einer Klasse von einer nicht-statische Methode eine statische Methode nennen:

ist
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, dass die statische Methode sein kann, ist, aufgerufen, 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 nennen würden.

Noch einmal, ich weiß, dass das nicht das ist, was das Detail der Frage verlangt, aber das könnte anderen Menschen hilfreich sein.

Verwandte Themen