Ich möchte Konstanten in a implementieren class
, da es dort sinnvoll ist, sie im Code zu lokalisieren.
Bisher habe ich die folgende Problemumgehung mit statischen Methoden implementiert:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Ich weiß, dass es eine Möglichkeit gibt, mit Prototypen herumzuspielen, aber viele empfehlen dagegen.
Gibt es eine bessere Möglichkeit, Konstanten in ES6-Klassen zu implementieren?
javascript
class
constants
ecmascript-6
Jérôme Verstrynge
quelle
quelle
Antworten:
Hier sind einige Dinge, die Sie tun könnten:
Exportieren Sie a
const
aus dem Modul . Abhängig von Ihrem Anwendungsfall können Sie einfach:Und importieren Sie das bei Bedarf aus dem Modul. Aufbauend auf Ihrer Idee einer statischen Methode können Sie auch einen
static
Get-Accessor deklarieren :Auf diese Weise benötigen Sie keine Klammern:
Babel REPL Beispiel
Dann können Sie, wie Sie sagen, da a
class
nur syntaktischer Zucker für eine Funktion ist, einfach eine nicht beschreibbare Eigenschaft wie folgt hinzufügen:Es könnte schön sein, wenn wir einfach so etwas machen könnten:
Leider ist diese Klasseneigenschaftssyntax nur in einem ES7-Vorschlag enthalten, und selbst dann kann sie nicht
const
zur Eigenschaft hinzugefügt werden .quelle
this.defineProperty(this, 'constant1', {...})
Scheint für mich zu arbeiten.
quelle
this.MyConst
innerhalb einerWhatever
Instanz verwenden können, müssen Sie es immer so schreiben:Whatever.MyConst
Ich verwende
babel
und die folgende Syntax funktioniert für mich:Bitte beachten Sie, dass Sie die Voreinstellung benötigen
"stage-0"
.So installieren Sie es:
Aktualisieren:
derzeit verwenden
stage-3
quelle
stage-2
Object.freeze()
der Klasse das beheben?In diesem Dokument heißt es:
Dies bedeutet, dass es absichtlich so ist.
Vielleicht können Sie eine Variable im Konstruktor definieren?
quelle
Es ist auch möglich, ein
Object.freeze
Objekt der Klasse (es6) / Konstruktorfunktion (es5) zu verwenden, um es unveränderlich zu machen:Der Versuch, die Klasse zu ändern, führt zu einem Soft-Fail (wirft keine Fehler, hat einfach keine Auswirkung).
quelle
Object.freeze()
, Unveränderlichkeit durchzusetzen, und habe es in letzter Zeit viel benutzt. Vergessen Sie nicht, es rekursiv anzuwenden!Vielleicht setzen Sie einfach alle Ihre Konstanten in ein eingefrorenes Objekt?
quelle
Wie https://stackoverflow.com/users/2784136/rodrigo-botti sagte, ich denke, Sie suchen
Object.freeze()
. Hier ist ein Beispiel für eine Klasse mit unveränderlicher Statik:quelle
Hier ist noch eine Möglichkeit, die Sie tun können
Hinweis - Die Reihenfolge ist wichtig. Sie können die obigen Konstanten nicht verwenden
Verwendung console.log (Auto.CONSTANT1);
quelle
Sie können eine Möglichkeit zum Definieren statischer Konstanten für eine Klasse mithilfe einer ungeraden Funktion von ES6-Klassen erstellen. Da Statik von ihren Unterklassen geerbt wird, können Sie Folgendes tun:
quelle
Sie können die "Konstanten" schreibgeschützt (unveränderlich) machen, indem Sie die Klasse einfrieren. z.B
quelle
Wenn Sie mit dem Mischen und Anpassen zwischen Funktions- und Klassensyntax vertraut sind, können Sie Konstanten nach der Klasse deklarieren (die Konstanten werden 'aufgehoben'). Beachten Sie, dass Visual Studio Code Schwierigkeiten hat, die gemischte Syntax automatisch zu formatieren (obwohl dies funktioniert).
quelle
Ich war das.
Der Wert von PI ist vor Änderungen geschützt, da er von einer Funktion zurückgegeben wird. Sie können über Circle.PI darauf zugreifen. Jeder Versuch, ihn zuzuweisen, wird einfach auf den Boden fallen gelassen, ähnlich wie der Versuch, einem Zeichenfolgenzeichen über [] zuzuweisen.
quelle
Sie können es folgendermaßen definieren:
quelle
Sie könnten
import * as
Syntax verwenden. Obwohl sie keine Klasse sind, sind sie echteconst
Variablen.Constants.js
index.js
quelle