Variables miembro en clases ES6


¿Hay alguna forma de usar la notación ECMAScript6 class para declarar una variable de clase estática o un valor predeterminado para una variable de instancia? Sin class lo que tengo en mente se escribiría como

function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";

La notación similar a ES6 más obvia en mi opinión habría sido

class MyClass {
    constructor(arg) { if(arg) this.arg = arg; }
    static let classVariable = 42;
    let arg = "no arg specified";
}

Pero esto no funciona, ya que de acuerdo con el actual borrador de especificaciones las únicas producciones de ClassElement son métodos estáticos y de instancia y punto y coma por sí mismos. OK, uno puede usar un par de métodos getter y setter para lograr una semántica similar a la que describí, pero supongo que con una severa penalización de rendimiento y con una sintaxis realmente extraña.

¿Hay algún borrador que sugiera incluir variables en la notación class, de una forma u otra? Si es así, ¿cuál fue la sintaxis sugerida, dónde se publicó, dónde se discutió, cómo fue la discusión, y cuál es el estado actual de las cosas en ese frente? Tal como está, esta pregunta no puede ser respondió si no hay tal cosa que se ha discutido antes, en cualquier nivel, pero considero que raro.


Un poco de antecedentes: Actualmente estoy jugando con el compilador de cierre de Google realizando una compilación avanzada, utilizando ES6 como entrada. Para que eso funcione, necesito un lugar para poner mis anotaciones de tipo para las variables miembro, y solía colocarlas usando sintaxis como /** @type {string} */ MyClass.prototype.arg; que es un no-op semántico en ECMAScript pero proporciona la información de tipo al compilador de cierre de manera agradable y fácil. No he sin embargo, encontró una manera similar agradable de hacer esto con una construcción class. Pero si te importa abordar este aspecto, eso sería un comentario. La pregunta anterior es acerca de las declaraciones de los miembros que son más que no-ops, así que eso es lo que una respuesta aquí debe discutir.

Author: MvG, 2015-02-03

3 answers

ES6 casi seguramente no cubrirá la sintaxis para definir variables de clase. Solo los métodos y getters/setters pueden ser definidos usando la sintaxis de la clase. Esto significa que todavía tendrá que ir a la ruta MyClass.classVariable = 42; para las variables de clase.

Si solo desea inicializar una clase con algunos valores predeterminados, hay una nueva sintaxis enriquecida para el argumento de la función y los valores predeterminados de desestructuración que puede usar. Para dar un ejemplo simple:

class Foo {
    constructor(foo = 123) {
        this.foo = foo;
    }
}

new Foo().foo == 123
new Foo(42).foo == 42
 33
Author: lyschoening,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-03 21:34:14

No he usado Google Closure Compiler, pero con Babel puedes declarar static (scoped to a class) variables como se describe aquí. El artículo se centra en React debido a la utilidad de los miembros static para React, pero es aplicable a ES6 classes en general.

La sintaxis está cerca de la sintaxis propuesta:

class MyClass {
    constructor(arg) { if(arg) this.arg = arg; }
    static defaultArg = 42;
    let arg = MyClass.defaultArg;
}

Tenga en cuenta que tendrá que agregar 'es7.classProperties' a su .babelrc para que esto se compile. Consulte las notas de la versión de Babel 5.0.0 para obtener más información.

Yo no saber si hay una manera de declarar un static como un const.

 6
Author: ericsoco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-11 21:43:26

Aunque no es parte de la especificación ES6, parece que llegará pronto y ya está soportado por Babel y algunos otros.

Aquí está la especificación: https://github.com/jeffmo/es-class-fields-and-static-properties

Y una lista completa de todas las propuestas y su estado: https://github.com/tc39/ecma262

 3
Author: Clayton Gulick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 17:42:07