ES6 - Виклик статичного методу в класі


82

У мене є цей клас, який робить внутрішній виклик статичного методу:

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

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

Чи є якісь ключові слова, якими я можу замінити назву класу в рядку нижче:

GeneralHelper.is('prod');

У PHP є selfі staticт. Д. Чи пропонує ES6 щось подібне до них?

TY.


Я опублікував більш складну відповідь в окремій темі щодо цього питання: stackoverflow.com/a/43694337/3182819
Томас Урбан

Відповіді:


74

якщо ви викликаєте статичну функцію зсередини екземпляра, правильним способом посилання на статичну функцію класу є:

this.constructor.functionName();

es6 викликає статичні методи


11
OP не запитує про виклик його з екземпляра. (Якби він був, це був би дублікат запитання, яке ви зв’язали)
Бергі,

Це навіть не відповідь. this.constructor.is('prod')в цьому випадку викине помилку.
UtkarshPramodGupta

Це рішення, коли ви хочете викликати свій статичний метод, коли ви перебуваєте всередині екземпляра класу, інакше ви просто телефонуєте this.method(). Також, коли ви продовжуєте клас, вам телефонуютьsuper.method()

54

Це те саме, що викликати метод на звичайному об’єкті . Якщо ви викликаєте GeneralHelper.isProd()метод, GeneralHelperбуде доступно як thisу методі, тож ви можете використовувати

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

Однак це не буде працювати, коли метод передається як функція зворотного виклику, як зазвичай . Крім того, це може відрізнятися від GeneralHelperявного доступу, коли хтось успадковує isProdваш клас і перезаписує is,InheritedHelper.isProd() дасть інші результати.

Якщо ви хочете викликати статичні методи з методів екземпляра, дивіться тут . Також зауважте, що клас, який визначає лише статичні методи, є дивною, ви можете замість цього використовувати звичайний об’єкт.


17
я думаю, досить заплутано використовувати ключове слово "this" у статичному контексті, але в будь-якому випадку воно працює нормально, дякую
Шломі

6
Так, у PHP $ це відноситься до поточного об’єкта, що знаходиться в його методі, до методів класу (static) у вас не існує цього ключового слова (у вас є „self“ та найновіший „static“). Наскільки я пам’ятаю, також у Java ключове слово "this" недоступне для статичного методу - і це має сенс: не існує "this" сутності, коли ви знаходитесь у статичному контексті .. "this" повинен говорити про конкретну сутність і статичний метод, який ви використовуєте для цілого класу або для загальних дій ..
Шломі

11
Як розробник JS, дуже важливо розуміти, як thisповодиться. Це працює не так, як thisв інших мовах.
loganfsmyth

1
@kidwon: Виклик конструктора схожий на виклик методу, тому він такий самий, як і там (з тією лише різницею, що він thisне використовується до супервиклику).
Бергі

1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani

33

Обидві відповіді тут правильні та хороші, але я хотів би додати додаткові деталі, виходячи із заголовка цього запитання.

Коли я побачив "ES6 - викликати статичний метод у класі", це звучало як "викликати статичний метод (із нестатичного методу) у класі". Визначте не те, що задає питання, яке задає початкове запитання, у деталях.

Але для тих, хто хоче знати, як викликати статичний метод з нестатичного методу в класі, ви можете зробити це так:

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

Ідея полягає в тому, що статичний метод може бути викликаний без створення нового екземпляра класу. Це означає, що ви можете викликати його всередині методу екземпляра так само, як і поза межами екземпляра.

Знову ж таки, я знаю, що це не те, про що запитували деталі запитання, але це може бути корисним для інших людей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.