← Kembali ke kursus
Pelajaran kursus · JavaScript
Pelajaran 22

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`.