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.


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.