¿Declarar constantes estáticas en clases de ES6?

Resuelto Jérôme Verstrynge asked hace 9 años • 20 respuestas

Quiero implementar constantes en a class, porque ahí es donde tiene sentido ubicarlas en el código.

Hasta ahora, he estado implementando la siguiente solución con métodos estáticos:

class MyClass {
    static constant1() { return 33; }
    static constant2() { return 2; }
    // ...
}

Sé que existe la posibilidad de jugar con prototipos, pero muchos lo desaconsejan.

¿Existe una mejor manera de implementar constantes en las clases de ES6?

Jérôme Verstrynge avatar Sep 18 '15 15:09 Jérôme Verstrynge
Aceptado

Aquí hay algunas cosas que podrías hacer:

Exportar a constdesde el módulo . Dependiendo de su caso de uso, podría simplemente:

export const constant1 = 33;

E impórtelo desde el módulo cuando sea necesario. O, basándose en su idea de método estático, podría declarar un static descriptor de acceso get :

const constant1 = 33,
      constant2 = 2;
class Example {

  static get constant1() {
    return constant1;
  }

  static get constant2() {
    return constant2;
  }
}

De esa manera, no necesitarás paréntesis:

const one = Example.constant1;

Ejemplo de REPL de Babel

Luego, como usted dice, dado que a classes solo azúcar sintáctico para una función, puede agregar una propiedad que no se puede escribir de esta manera:

class Example {
}
Object.defineProperty(Example, 'constant1', {
    value: 33,
    writable : false,
    enumerable : true,
    configurable : false
});
Example.constant1; // 33
Example.constant1 = 15; // TypeError

Sería bueno si pudiéramos hacer algo como:

class Example {
    static const constant1 = 33;
}

Pero desafortunadamente esta sintaxis de propiedad de clase solo está en una propuesta de ES7, e incluso así no permitirá agregarla consta la propiedad.

CodingIntrigue avatar Sep 18 '2015 08:09 CodingIntrigue
class Whatever {
    static get MyConst() { return 10; }
}

let a = Whatever.MyConst;

Parece funcionar para mi.

Benny Jobigan avatar May 10 '2018 10:05 Benny Jobigan

Estoy usando babely la siguiente sintaxis me funciona:

class MyClass {
    static constant1 = 33;
    static constant2 = {
       case1: 1,
       case2: 2,
    };
    // ...
}

MyClass.constant1 === 33
MyClass.constant2.case1 === 1

Por favor considere que necesita el preset "stage-0".
Para instalarlo:

npm install --save-dev babel-preset-stage-0

// in .babelrc
{
    "presets": ["stage-0"]
}

Actualización para el escenario:

se avanzó stage-3.

Actualización Babel 7:

Según Babel 7, los ajustes preestablecidos de la etapa están en desuso .

El complemento de Babel a utilizar es @babel/plugin-proposal-class-properties.

npm i --save-dev @babel/plugin-proposal-class-properties

{
    "plugins": ["@babel/plugin-proposal-class-properties"]
}

Nota: este complemento está incluido en @babel/preset-env

borracciaBlu avatar Aug 24 '2016 06:08 borracciaBlu