web-dev-qa-db-fra.com

Variables membres dans les classes ES6

Est-il possible 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 de type 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, car selon le brouillon actuel des spécifications , les seules productions de ClassElement sont des méthodes statiques et d'instance, et points-virgules tout seuls. OK, on ​​peut utiliser une paire de méthodes getter et setter pour obtenir une sémantique similaire à celle décrite précédemment, mais je suppose qu’il ya pénalité en termes de performances et de syntaxe vraiment bizarre.

Existe-t-il un brouillon suggérant d’inclure des variables dans la notation class, d’une manière ou d’une autre? Si tel est le cas, quelle a été la syntaxe suggérée, où a-t-il été publié, où a-t-il été discuté, comment s'est déroulée la discussion et quelle est la situation actuelle à cet égard? En l'état actuel des choses, il est impossible de répondre à cette question si rien de tel n'a été discuté auparavant, à quelque niveau que ce soit, mais j'estime que c'est peu probable.


Un peu d’arrière-plan: je suis en train de jouer avec le compilateur de fermetures Google qui effectue une compilation avancée en utilisant ES6 comme entrée. Pour que cela fonctionne, j'ai besoin d'un emplacement 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 Nice et facile. Je n'ai pas encore trouvé de moyen similaire pour faire cela avec une construction class. Mais si vous souhaitez aborder cet aspect, ce serait un commentaire. La question ci-dessus concerne les déclarations de membres qui sont plus que des no-ops, c'est donc ce dont une réponse devrait discuter ici.

29
MvG

ES6 ne couvrira presque certainement pas la syntaxe permettant de définir les variables de classe. Seules les méthodes et les getters/setters peuvent être définis à l'aide de la syntaxe de classe. Cela signifie que vous devrez toujours aller le MyClass.classVariable = 42; route pour les variables de classe.

Si vous souhaitez simplement initialiser une classe avec des valeurs par défaut, vous pouvez utiliser un nouveau jeu de syntaxe riche pour les arguments de fonction et les valeurs par défaut de déstructuration. Pour donner un exemple simple:

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

new Foo().foo == 123
new Foo(42).foo == 42
41
lyschoening

Je n'ai pas utilisé Google Closure Compiler, mais avec Babel, vous pouvez déclarer les variables static (étendues à un class) comme décrit ici . L'article se concentre sur React en raison de l'utilité de static membres pour React, mais s'applique à ES6 classes en général.

La syntaxe est proche de la 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' à ton .babelrc pour cela compiler. Voir les notes de version de Babel 5.0. pour plus d'informations.

Je ne sais pas s'il existe un moyen de déclarer un static en tant que const.

7
ericsoco

Bien que cela ne fasse pas partie de la spécification ES6, cela semble être pour bientôt et est déjà pris en charge par Babel et quelques 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 de leur statut: https://github.com/tc39/ecma262

3
Clayton Gulick