Je veux implémenter des constantes dans a class
, car c'est là qu'il est logique de les localiser dans le code.
Jusqu'à présent, j'ai implémenté la solution de contournement suivante avec des méthodes statiques:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Je sais qu'il est possible de jouer avec les prototypes, mais beaucoup le déconseillent.
Existe-t-il un meilleur moyen d'implémenter des constantes dans les classes ES6?
javascript
class
constants
ecmascript-6
Jérôme Verstrynge
la source
la source
Réponses:
Voici quelques choses que vous pourriez faire:
Exportez un
const
depuis le module . Selon votre cas d'utilisation, vous pouvez simplement:Et importez cela depuis le module si nécessaire. Ou, en vous appuyant sur votre idée de méthode statique, vous pouvez déclarer un
static
accesseur get :De cette façon, vous n'aurez pas besoin de parenthèses:
Exemple Babel REPL
Ensuite, comme vous le dites, comme a
class
n'est qu'un sucre syntaxique pour une fonction, vous pouvez simplement ajouter une propriété non inscriptible comme ceci:Ce serait bien si nous pouvions faire quelque chose comme:
Mais malheureusement, cette syntaxe de propriété de classe est uniquement dans une proposition ES7, et même alors, elle ne permettra pas d'ajouter
const
à la propriété.la source
this.defineProperty(this, 'constant1', {...})
Semble fonctionner pour moi.
la source
this.MyConst
à l'intérieur d'uneWhatever
instance, vous devez toujours l'écrire comme ceci:Whatever.MyConst
J'utilise
babel
et la syntaxe suivante fonctionne pour moi:Veuillez considérer que vous avez besoin du préréglage
"stage-0"
.Pour l'installer:
Mettre à jour:
utiliser actuellement
stage-3
la source
stage-2
Object.freeze()
à la classe résoudrait-il cela?Dans ce document, il indique:
Cela signifie que c'est intentionnellement comme ça.
Peut-être pouvez-vous définir une variable dans le constructeur?
la source
Il est également possible d'utiliser
Object.freeze
sur votre objet classe (es6) / fonction constructeur (es5) pour le rendre immuable:Essayer de modifier la classe vous donnera un soft-fail (ne lancera aucune erreur, cela n'aura tout simplement aucun effet).
la source
Object.freeze()
imposer l'immuabilité et je l'utilise beaucoup ces derniers temps. N'oubliez pas de l'appliquer récursivement!Peut-être juste mettre toutes vos constantes dans un objet figé?
la source
Comme https://stackoverflow.com/users/2784136/rodrigo-botti a dit, je pense que vous cherchez
Object.freeze()
. Voici un exemple de classe avec une statique immuable:la source
Voici une autre façon de faire
Remarque - L'ordre est important, vous ne pouvez pas avoir les constantes ci-dessus
Utilisation console.log (Auto.CONSTANT1);
la source
Vous pouvez créer un moyen de définir des constantes statiques sur une classe en utilisant une caractéristique étrange des classes ES6. Étant donné que les statiques sont héritées par leurs sous-classes, vous pouvez effectuer les opérations suivantes:
la source
Vous pouvez rendre les "constantes" en lecture seule (immuables) en gelant la classe. par exemple
la source
Si vous êtes à l'aise pour mélanger et faire correspondre la fonction et la syntaxe de classe, vous pouvez déclarer des constantes après la classe (les constantes sont «levées»). Notez que Visual Studio Code aura du mal à formater automatiquement la syntaxe mixte (bien que cela fonctionne).
la source
J'ai fait ça.
La valeur de PI est protégée contre toute modification car il s'agit d'une valeur renvoyée par une fonction. Vous pouvez y accéder via Circle.PI. Toute tentative de l'assigner est simplement abandonnée sur le sol d'une manière similaire à une tentative d'assigner à un caractère de chaîne via [].
la source
Vous pouvez le définir comme ceci:
la source
Vous pouvez utiliser la
import * as
syntaxe. Bien qu'il ne s'agisse pas d'une classe, ce sont de vraiesconst
variables.Constants.js
index.js
la source