ES6: llamar al método estático dentro de una clase

82

Tengo esta clase que hace una llamada interna a un método estático:

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

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

¿Hay alguna palabra clave que pueda usar para reemplazar el nombre de la clase en la línea a continuación?

GeneralHelper.is('prod');

En PHP hay self, staticetc. ¿ES6 proporciona algo similar a estos?

TY.

Shlomi
fuente
Publiqué una respuesta más compleja en un hilo separado con respecto a este problema: stackoverflow.com/a/43694337/3182819
Thomas Urban

Respuestas:

74

Si está llamando a la función estática desde dentro de una instancia, la forma correcta de referirse a la función estática de la clase es:

this.constructor.functionName();

es6 llamar a métodos estáticos

Otto Nascarella
fuente
11
OP no pregunta acerca de llamarlo desde una instancia. (Si lo fuera, sería un duplicado de la pregunta que vinculó)
Bergi
Ni siquiera es una respuesta. this.constructor.is('prod')arrojaría error en este caso.
UtkarshPramodGupta
Esta es la solución cuando desea llamar a su método estático cuando está dentro de una clase instanciada. De lo contrario, simplemente llame this.method(). Además, cuando extiendes una clase, llamassuper.method()
54

Es lo mismo que llamar a un método en un objeto ordinario . Si llama al GeneralHelper.isProd()método, GeneralHelperestará disponible como thisen el método, por lo que puede usar

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

Sin embargo, esto no funcionará cuando el método se pase como una función de devolución de llamada, como de costumbre . Además, puede ser diferente de acceder GeneralHelperexplícitamente cuando alguien hereda isProdde su clase y sobrescribe is, InheritedHelper.isProd()producirá otros resultados.

Si está buscando llamar a métodos estáticos desde métodos de instancia, consulte aquí . También tenga en cuenta que una clase que solo define métodos estáticos es un bicho raro, es posible que desee utilizar un objeto simple en su lugar.

Bergi
fuente
17
Creo que es bastante confuso usar "esta" palabra clave en un contexto estático, pero de todos modos funciona bien, gracias
Shlomi
6
Sí, en PHP $ esto se refiere al objeto actual en el que se encuentra dentro de su método, en la clase 'métodos (estáticos) no tiene esta palabra clave existente (tiene' self 'y el más nuevo' estático '). Por lo que recuerdo, también en Java "esta" palabra clave no está disponible en un método estático, y tiene sentido: no hay una entidad "esto" cuando estás en un contexto estático ... "esto" debe hablar entidad particular y en el método estático al que te refieres para toda la clase o para acciones generales ..
Shlomi
11
Como desarrollador de JS, es muy importante comprender cómo se thiscomporta. No funciona como thisen otros idiomas.
loganfsmyth
1
@kidwon: La invocación de un constructor es bastante similar a la invocación de un método, por lo que es igual que allí (con la única diferencia de que thisno se puede usar antes de la super llamada).
Bergi
1
@kidwonconstructor(){ CLASS_NAME.STATIC_METHOD(); }
Morteza Tourani
33

Ambas respuestas aquí son correctas y buenas, pero quería agregar un detalle adicional basado en el título de esta pregunta.

Cuando vi "ES6 - Llamar a un método estático dentro de una clase" sonó como "llamar a un método estático (desde un método no estático) dentro de una clase". No defina lo que el autor de la pregunta inicial está preguntando en los detalles.

Pero para cualquiera que quiera saber cómo llamar a un método estático desde un método no estático dentro de una clase, puede hacerlo así:

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

La idea es que se pueda llamar al método estático sin crear una nueva instancia de la clase. Eso significa que puede llamarlo dentro del método de una instancia de la misma manera que lo llamaría fuera de la instancia.

Nuevamente, sé que eso no es lo que pedían los detalles de la pregunta, pero esto podría ser útil para otras personas.

Chris Schmitz
fuente