Saya ingin menerapkan konstanta dalam class
, karena di situlah masuk akal untuk menempatkan mereka dalam kode.
Sejauh ini, saya telah mengimplementasikan solusi berikut dengan metode statis:
class MyClass {
static constant1() { return 33; }
static constant2() { return 2; }
// ...
}
Saya tahu ada kemungkinan untuk mengutak-atik prototipe, tetapi banyak yang merekomendasikan ini.
Apakah ada cara yang lebih baik untuk mengimplementasikan konstanta di kelas ES6?
javascript
class
constants
ecmascript-6
Jérôme Verstrynge
sumber
sumber
Jawaban:
Berikut beberapa hal yang dapat Anda lakukan:
Ekspor a
const
dari modul . Tergantung pada kasus penggunaan Anda, Anda bisa saja:Dan impor itu dari modul jika perlu. Atau, membangun ide metode statis Anda, Anda dapat mendeklarasikan
static
aksesor get :Dengan begitu, Anda tidak perlu tanda kurung:
Contoh Babel REPL
Kemudian, seperti yang Anda katakan, karena a
class
hanya gula sintaksis untuk suatu fungsi, Anda bisa menambahkan properti yang tidak bisa ditulisi seperti:Mungkin menyenangkan jika kita bisa melakukan sesuatu seperti:
Tetapi sayangnya sintaksis properti kelas ini hanya ada dalam proposal ES7, dan meskipun demikian itu tidak akan memperbolehkan untuk menambahkan
const
ke properti.sumber
this.defineProperty(this, 'constant1', {...})
Tampaknya bekerja untuk saya.
sumber
this.MyConst
dari dalamWhatever
instance, Anda harus selalu menulisnya seperti ini:Whatever.MyConst
Saya menggunakan
babel
dan sintaks berikut bekerja untuk saya:Harap pertimbangkan bahwa Anda memerlukan preset
"stage-0"
.Untuk menginstalnya:
Memperbarui:
sedang digunakan
stage-3
sumber
stage-2
Object.freeze()
kelas memperbaikinya?Dalam dokumen ini disebutkan:
Ini berarti memang sengaja seperti ini.
Mungkin Anda bisa mendefinisikan variabel dalam konstruktor?
sumber
Hal ini juga memungkinkan untuk menggunakan
Object.freeze
pada Anda kelas (ES6) / konstruktor fungsi (ES5) objek untuk membuatnya berubah:Mencoba mengubah kelas akan memberi Anda soft-fail (tidak akan membuang kesalahan, itu hanya tidak akan berpengaruh).
sumber
Object.freeze()
menerapkan imutabilitas, dan telah sering menggunakannya akhir-akhir ini. Hanya saja, jangan lupa untuk menerapkannya secara rekursif!Mungkin hanya meletakkan semua konstanta Anda di objek beku?
sumber
Seperti https://stackoverflow.com/users/2784136/rodrigo-botti berkata, saya pikir Anda sedang mencari
Object.freeze()
. Berikut adalah contoh kelas dengan statika yang tidak dapat diubah:sumber
Inilah satu lagi cara yang bisa Anda lakukan
Catatan - Perintah itu penting, Anda tidak dapat memiliki konstanta di atas
Penggunaan console.log (Auto.CONSTANT1);
sumber
Anda dapat membuat cara untuk mendefinisikan konstanta statis pada kelas menggunakan fitur aneh kelas ES6. Karena statika diwarisi oleh subkelasnya, Anda dapat melakukan hal berikut:
sumber
Anda dapat membuat "konstanta" read-only (tidak berubah) dengan membekukan kelas. misalnya
sumber
Jika Anda merasa nyaman mencampur dan mencocokkan antara sintaks fungsi dan kelas, Anda dapat mendeklarasikan konstanta setelah kelas (konstanta 'diangkat'). Perhatikan bahwa Visual Studio Code akan berjuang untuk memformat sintaksis campuran secara otomatis, (meskipun berfungsi).
sumber
Saya melakukan ini.
Nilai PI dilindungi dari perubahan karena itu adalah nilai yang dikembalikan dari suatu fungsi. Anda dapat mengaksesnya melalui Circle.PI. Setiap upaya untuk menetapkannya hanya dijatuhkan di lantai dengan cara yang mirip dengan upaya untuk menetapkan ke karakter string melalui [].
sumber
Anda dapat mendefinisikannya seperti ini:
sumber
Anda bisa menggunakan
import * as
sintaks. Meskipun bukan kelas, mereka adalahconst
variabel nyata .Constants.js
index.js
sumber