ES6 - Wywołaj metodę statyczną w klasie

82

Mam tę klasę, która wykonuje wewnętrzne wywołanie metody statycznej:

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

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

Czy są jakieś słowa kluczowe, których mogę użyć do zastąpienia nazwy klasy w poniższym wierszu:

GeneralHelper.is('prod');

W PHP istnieje self, staticitd. Czy ES6 dostarczyć coś podobnego do nich?

TY.

Shlomi
źródło
Opublikowałem bardziej złożoną odpowiedź w osobnym wątku dotyczącym tego problemu: stackoverflow.com/a/43694337/3182819
Thomas Urban

Odpowiedzi:

74

jeśli wywołujesz funkcję statyczną z wnętrza instancji, właściwym sposobem odniesienia się do funkcji statycznej klasy jest:

this.constructor.functionName();

es6 wywołuje metody statyczne

Otto Nascarella
źródło
11
OP nie pyta o wywołanie go z instancji. (Gdyby tak było, byłoby to duplikatem pytania, które łączysz)
Bergi,
To nawet nie jest odpowiedź. this.constructor.is('prod')zgłosiłby błąd w tym przypadku.
UtkarshPramodGupta
Jest to rozwiązanie, gdy chcesz wywołać metodę statyczną, gdy jesteś wewnątrz klasy, której instancja jest utworzona, w przeciwnym razie po prostu wywołasz this.method() . Również kiedy przedłużasz zajęcia, dzwoniszsuper.method()
54

To to samo, co wywołanie metody na zwykłym obiekcie . Jeśli wywołasz GeneralHelper.isProd()metodę, GeneralHelperbędzie dostępna tak jak thisw metodzie, więc możesz użyć

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

To jednak nie zadziała, gdy metoda jest przekazywana jako funkcja zwrotna, tak jak zwykle . Ponadto może to różnić się od GeneralHelperjawnego dostępu, gdy ktoś dziedziczy isProdpo twojej klasie i nadpisuje is, InheritedHelper.isProd()przyniesie inne wyniki.

Jeśli chcesz wywołać metody statyczne z metod instancji, zobacz tutaj . Zauważ również, że klasa, która definiuje tylko metody statyczne, jest dziwaczna, możesz zamiast tego użyć zwykłego obiektu.

Bergi
źródło
17
myślę, że to dość mylące, używanie słowa kluczowego „this” w kontekście statycznym, ale i tak działa dobrze, dzięki
Shlomi
6
Tak, w PHP $ to odnosi się do bieżącego obiektu, w którym jesteś w metodzie, do metod klasowych (statycznych) nie masz tego słowa kluczowego (masz „self” i najnowsze „static”). O ile pamiętam, również w Javie słowo kluczowe „this” nie jest dostępne w metodzie statycznej - i ma to sens: nie ma „tej” encji, kiedy jesteś w statycznym kontekście. konkretny byt i do statycznej metody, którą kierujesz dla całej klasy lub dla ogólnych działań ..
Shlomi
11
Jako programista JS bardzo ważne jest zrozumienie, jak się thiszachowuje. Nie działa jak thisw innych językach.
loganfsmyth
1
@kidwon: Wywołanie konstruktora jest podobne do wywołania metody, więc jest takie samo jak tam (z tą różnicą, że thisnie można go używać przed wywołaniem super).
Bergi
1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani
33

Obie odpowiedzi tutaj są poprawne i dobre, ale chciałem dorzucić dodatkowe szczegóły w oparciu o tytuł tego pytania.

Kiedy zobaczyłem „ES6 - wywołanie metody statycznej w klasie” brzmiało to jak „wywołanie metody statycznej (z metody niestatycznej) w klasie”. Nie definiuj szczegółów, o co zadaje pytanie początkowe pytanie.

Ale dla każdego, kto chce wiedzieć, jak wywołać metodę statyczną z metody niestatycznej w klasie, możesz to zrobić w następujący sposób:

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!"

Chodzi o to, że metodę statyczną można wywołać bez tworzenia nowej instancji klasy. Oznacza to, że możesz wywołać go wewnątrz metody instancji w taki sam sposób, jak wywołujesz ją poza instancją.

Ponownie, wiem, że nie o to chodziło w tym pytaniu, ale może to być pomocne dla innych osób.

Chris Schmitz
źródło