example - javascript static variable es6
Variables de los miembros en las clases de ES6 (3)
¿Hay alguna forma de usar la notación de class
ECMAScript6 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 hubiera 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 borrador de especificaciones actual, las únicas producciones de ClassElement son métodos estáticos y de instancia y punto y coma por sí mismos. De acuerdo, se pueden usar un par de métodos de obtención y configuración para lograr una semántica similar a la que describí, pero supongo que hay una severa penalización del rendimiento y una sintaxis realmente extraña.
¿Hay algún borrador que sugiera incluir variables en la notación de 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 responderse si no se ha discutido tal cosa antes, a cualquier nivel, pero considero que es poco probable.
Un poco de fondo: 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 colocar mis anotaciones de tipo para las variables miembro, y solía /** @type {string} */ MyClass.prototype.arg;
utilizando una sintaxis como /** @type {string} */ MyClass.prototype.arg;
que es un no-op semántico en ECMAScript pero proporciona la información de tipo para el compilador de cierre de forma agradable y fácil. Todavía no he encontrado una forma similar de hacerlo con una construcción de class
. Pero si te interesa abordar este aspecto, 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í debería discutir.
Es casi seguro que ES6 no cubra la sintaxis para definir variables de clase. Solo los métodos y los captadores / definidores se pueden definir utilizando la sintaxis de clase. Esto significa que todavía tendrás que ir a MyClass.classVariable = 42;
Ruta para las variables de clase.
Si solo desea inicializar una clase con algunos valores predeterminados, hay una nueva sintaxis establecida 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
No he usado Google Closure Compiler, pero con Babel puede declarar variables static
(con alcance a una class
) como se describe here . El artículo se centra en React debido a la utilidad de static
miembros static
para React, pero es aplicable a las class
ES6 en general.
La sintaxis está cerca de tu 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. Ver las notas de la versión de Babel 5.0.0 para más información.
No sé si hay una manera de declarar una static
como una const
.
Si bien no es parte de la especificación ES6, parece que llegará pronto y ya es compatible con 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