Materi
Getter adalah method yang dibaca seperti property. Ditulis dengan kata get di depan nama method, tanpa parameter, dan dipanggil tanpa kurung: pesanan.total, bukan pesanan.total(). Nilainya dihitung ulang setiap kali dibaca, sehingga selalu mengikuti isi objek saat itu. Setter ditulis dengan kata set dan menerima tepat satu parameter; ia dijalankan ketika property itu diisi dengan tanda sama dengan, sehingga menjadi tempat memeriksa nilai sebelum disimpan.
Private field adalah property yang namanya diawali #, misalnya #celsius. Field ini wajib dideklarasikan di badan class dan hanya bisa dibaca atau diubah oleh kode di dalam class itu. Menulis objek.#celsius di luar class ditolak sebagai SyntaxError sebelum program dijalankan, dan field ini tidak muncul di Object.keys maupun JSON.stringify. Gabungan private field dengan getter tanpa setter menghasilkan property yang hanya bisa dibaca dari luar; hasilnya mirip closure di pelajaran fungsi tingkat tinggi, tetapi dalam bentuk class.
class Termometer {
#celsius = 0;
get celsius() {
return this.#celsius;
}
set celsius(nilai) {
if (typeof nilai !== "number") throw new TypeError("Suhu harus angka");
this.#celsius = nilai;
}
get fahrenheit() {
return (this.#celsius * 9) / 5 + 32;
}
}
const t = new Termometer();
t.celsius = 30;
t.fahrenheit; // 86
Object.keys(t); // []
t.fahrenheit = 100; // TypeError di strict mode: hanya ada getterProperty yang hanya punya getter tidak bisa diisi. Di strict mode, termasuk di dalam class, modul, dan latihan ini, pengisian itu menghentikan program dengan TypeError: Cannot set property fahrenheit of #<Termometer> which has only a getter. Di luar strict mode, pengisiannya diabaikan tanpa pesan.