Variables membres dans les classes ES6
Existe-t-il un moyen d'utiliser la notation ECMAScript6 class
pour déclarer une variable de classe statique ou une valeur par défaut pour une variable d'instance? Sans class
ce que j'ai en tête serait écrit comme
function MyClass(arg) { if(arg) this.arg = arg; }
MyClass.classVariable = 42;
MyClass.prototype.arg = "no arg specified";
La notation ES6 la plus évidente à mon avis aurait été
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static let classVariable = 42;
let arg = "no arg specified";
}
Mais cela ne fonctionne pas, puisque selon le projet de spécification actuel les seules productions de ClassElement sont des méthodes statiques et d'instance et des points-virgules tout seuls. OK, on peut utiliser une paire de méthodes getter et setter pour obtenir une sémantique similaire à ce que j'ai décrit, mais je suppose qu'à une pénalité de performance sévère et avec une syntaxe vraiment bizarre.
Y a-t-il un brouillon qui suggère d'inclure des variables dans la notation class
, d'une manière ou d'une autre? Si oui, quelle a été la syntaxe suggérée, où a-t-elle été publiée, où a-t-elle été discutée, comment s'est déroulée la discussion et quel est l'état actuel des choses sur ce front? En l'état, cette question ne peut pas être répondu si aucune telle chose n'a été discutée auparavant, à n'importe quel niveau, mais je considère que c'est improbable.
Un peu d'arrière-plan: je joue actuellement avec le compilateur de fermeture Google effectuant une compilation avancée, en utilisant ES6 en entrée. Pour que cela fonctionne, j'ai besoin d'un endroit pour mettre mes annotations de type pour les variables membres, et je les plaçais en utilisant une syntaxe comme /** @type {string} */ MyClass.prototype.arg;
qui est un no-op sémantique dans ECMAScript mais fournit les informations de type au compilateur de fermeture. Je n'ai pas pourtant, j'ai trouvé une façon tout aussi agréable de le faire avec une construction class
. Mais si vous souhaitez aborder cet aspect, ce serait un commentaire. La question ci-dessus concerne les déclarations des membres qui sont plus que des No-ops, donc c'est ce qu'une réponse ici devrait discuter.
3 réponses
ES6 ne couvrira presque certainement pas la syntaxe pour définir les variables de classe. Seules les méthodes et les getters / setters peuvent être définis en utilisant la syntaxe de classe. Cela signifie que vous devrez toujours suivre la route MyClass.classVariable = 42;
pour les variables de classe.
Si vous voulez simplement initialiser une classe avec quelques valeurs par défaut, il existe une nouvelle syntaxe riche pour l'argument de fonction et les valeurs par défaut de déstructuration que vous pouvez utiliser. Pour donner un exemple simple:
class Foo {
constructor(foo = 123) {
this.foo = foo;
}
}
new Foo().foo == 123
new Foo(42).foo == 42
Je n'ai pas utilisé le compilateur de fermeture Google, mais avec Babel, vous pouvez déclarer static
(étendue à une variable class
) comme décrit ici. L'article est axé sur React en raison de l'utilité des membres static
pour React, mais est applicable à ES6 class
es en général.
La syntaxe est proche de votre syntaxe proposée:
class MyClass {
constructor(arg) { if(arg) this.arg = arg; }
static defaultArg = 42;
let arg = MyClass.defaultArg;
}
Notez que vous devrez ajouter 'es7.classProperties'
à votre .babelrc
pour que cela soit compilé. Voir les notes de version Babel 5.0.0 pour plus d'informations.
Je ne sais pas savoir si il existe un moyen de déclarer un static
comme const
.
Bien qu'il ne fasse pas partie de la spécification ES6, cela semble arriver bientôt et est déjà supporté par Babel et d'autres.
Voici la spécification: https://github.com/jeffmo/es-class-fields-and-static-properties
Et une liste complète de toutes les propositions et leur statut: https://github.com/tc39/ecma262