Chcę zaimplementować stałe w class
, ponieważ to jest sens, aby znaleźć je w kodzie.
Do tej pory wdrażałem następujące obejście metodami statycznymi:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Wiem, że istnieje możliwość majstrowania przy prototypach, ale wielu nie zaleca tego.
Czy istnieje lepszy sposób na implementację stałych w klasach ES6?
javascript
class
constants
ecmascript-6
Jérôme Verstrynge
źródło
źródło
Odpowiedzi:
Oto kilka rzeczy, które możesz zrobić:
Wyeksportuj a
const
z modułu . W zależności od przypadku użycia możesz po prostu:W razie potrzeby zaimportuj to z modułu. Lub, bazując na Twojej idei statycznej metody, możesz zadeklarować
static
get accessor :W ten sposób nie będziesz potrzebować nawiasów:
Przykład Babel REPL
Następnie, jak mówisz, ponieważ a
class
jest po prostu cukrem syntaktycznym dla funkcji, możesz po prostu dodać właściwość, której nie można zapisać:Przydałoby się coś takiego:
Ale niestety ta składnia właściwości klasy jest tylko w propozycji ES7 i nawet wtedy nie pozwoli na dodanie
const
do właściwości.źródło
this.defineProperty(this, 'constant1', {...})
Wydaje się dla mnie pracować.
źródło
this.MyConst
wewnątrzWhatever
instancji, zawsze trzeba go napisać w następujący sposób:Whatever.MyConst
Używam
babel
i działa dla mnie następująca składnia:Proszę wziąć pod uwagę, że potrzebujesz ustawienia wstępnego
"stage-0"
.Aby zainstalować:
Aktualizacja:
obecnie używam
stage-3
źródło
stage-2
Object.freeze()
klasy to naprawi?W tym dokumencie stwierdza:
Oznacza to, że tak jest celowo.
Może możesz zdefiniować zmienną w konstruktorze?
źródło
Możliwe jest również użycie
Object.freeze
na tobie obiektu klasy (es6) / funkcji konstruktora (es5), aby stał się niezmienny:Próba zmiany klasy da ci miękki błąd (nie spowoduje żadnych błędów, po prostu nie przyniesie żadnego efektu).
źródło
Object.freeze()
wymuszać niezmienność i ostatnio często go używam. Tylko nie zapomnij zastosować go rekurencyjnie!Może po prostu umieścisz wszystkie swoje stałe w zamrożonym obiekcie?
źródło
Jak https://stackoverflow.com/users/2784136/rodrigo-botti powiedział: Myślę, że szukasz
Object.freeze()
. Oto przykład klasy z niezmienną statyką:źródło
Oto jeszcze jeden sposób, w jaki możesz to zrobić
Uwaga - kolejność jest ważna, nie możesz mieć stałych powyżej
Zastosowanie console.log (Auto.CONSTANT1);
źródło
Możesz stworzyć sposób definiowania stałych statycznych w klasie, używając dziwnej cechy klas ES6. Ponieważ staty są dziedziczone przez ich podklasy, możesz wykonać następujące czynności:
źródło
Możesz ustawić „stałe” tylko do odczytu (niezmienne), zamrażając klasę. na przykład
źródło
Jeśli nie masz nic przeciwko mieszaniu i dopasowywaniu składni funkcji i klasy, możesz zadeklarować stałe po klasie (stałe są „podnoszone”). Zauważ, że Visual Studio Code będzie miał problem z automatycznym formatowaniem mieszanej składni (choć działa).
źródło
Ja to zrobiłem.
Wartość PI jest chroniona przed zmianą, ponieważ jest to wartość zwracana z funkcji. Możesz uzyskać do niego dostęp za pośrednictwem Circle.PI. Każda próba przypisania do niego jest po prostu upuszczana na podłogę w sposób podobny do próby przypisania do znaku ciągu za pomocą [].
źródło
Możesz to zdefiniować w następujący sposób:
źródło
Możesz użyć
import * as
składni. Chociaż nie są klasą, są prawdziwymiconst
zmiennymi.Constants.js
index.js
źródło