Private field, mixin, static block
Private #, static initializer, mixin pattern.
Pahami konsepnya
Private field (#nama) dan private method (#method()) benar-benar terkunci — hanya kode DI DALAM class yang bisa mengaksesnya. Ini berbeda dari konvensi _nama yang hanya "dihormati" tapi tidak dijalankan. Static block (class level initializer) berjalan sekali saat class didefinisikan: class Config { static { this.api = "..."; } }.
Mixin adalah pola menambah method ke class TANPA pewarisan: Object.assign(MyClass.prototype, mixinObject). Ini berguna bila butuh method dari beberapa sumber — JavaScript tidak mendukung multiple inheritance class, tapi mixin menggantikannya.
Instance vs static: instance method dipanggil dari objek (ari.tambah()), static dari class (Siswa.bandingkan()). Static tidak bisa mengakses this instance.
Coba contoh kode
class Kalkulator {
#riwayat = []; // private field
#simpan(operasi) { // private method
this.#riwayat.push(operasi);
}
tambah(a, b) {
const hasil = a + b;
this.#simpan(`tambah: ${hasil}`);
return hasil;
}
get log() { return this.#riwayat; }
}
const k = new Kalkulator();
k.tambah(3, 5);
k.tambah(10, 20);
console.log(k.log); // ["tambah: 8", "tambah: 30"]
// console.log(k.#riwayat); // SyntaxError!
// mixin
const Loggable = { log() { console.log(this.nama); } };
class Item { constructor(nama) { this.nama = nama; } }
Object.assign(Item.prototype, Loggable);
new Item("test").log();#riwayat dan #simpan benar-benar private — akses dari luar SyntaxError. Mixin Loggable menambahkan method log() ke Item.prototype tanpa pewarisan.
Latihan singkat
Uji: Counter dengan #count — increment() lalu read(), harus `1`.