Coba bayangin kamu lagi bikin game yang ada 100 musuh di layar. Tiap musuh punya nyawa sendiri, posisi sendiri, kecepatan sendiri, tapi semua bisa method yang sama: serang(), bergerak(), mati(). Bikin object satu-satu untuk 100 musuh? Mimpi buruk maintenance. Solusinya: class — cetakan/blueprint yang bisa dipake bikin banyak object dengan struktur sama. Sekali bikin class Musuh, kamu bisa bikin 100 instance: new Musuh(), new Musuh(), dst.
💡 Drama JavaScript class. Class baru muncul di JavaScript tahun 2015 (ES6) — telat banget dibanding bahasa lain (Python, Java udah punya dari 90-an). Dan diam-diam, class JavaScript itu cuma "syntactic sugar" di atas prototype system yang kamu pelajari sebelumnya. Di balik layar, semua tetep berjalan via prototype chain.
Membuat class:
class Persegi {
constructor(sisi) {
this.sisi = sisi;
}
luas() {
return this.sisi * this.sisi;
}
keliling() {
return 4 * this.sisi;
}
}
const kotak = new Persegi(5);
console.log(kotak.luas()); // 25
console.log(kotak.keliling()); // 20
constructordipanggil otomatis saat membuat instance baru dengannewthismerujuk ke instance yang sedang dibuat- Method ditulis langsung di dalam class tanpa kata kunci
function
Inheritance dengan extends:
class Hewan {
constructor(nama) {
this.nama = nama;
}
bersuara() {
return this.nama + " bersuara!";
}
}
class Kucing extends Hewan {
constructor(nama, warna) {
super(nama); // panggil constructor parent
this.warna = warna;
}
bersuara() {
return this.nama + " bersuara: Meong!";
}
}
const anggora = new Kucing("Anggora", "putih");
console.log(anggora.bersuara()); // "Anggora bersuara: Meong!"
extendsmembuat class anak mewarisi semua method dari class induksuper()memanggil constructor class induk — wajib dipanggil sebelum menggunakanthis
🎭 Analogi sehari-hari
Class = cetakan kue. Sekali bikin cetakan, kamu bisa cetak banyak kue dengan bentuk sama (new Persegi(5), new Persegi(10)). Setiap kue punya isi sendiri (sisi sendiri).
extends = modifikasi cetakan — cetakan kue dasar (Hewan), modifikasi jadi cetakan khusus kucing (warna putih, suara meong). Semua sifat dasar tetap, plus tambahan.
⚠️ Jebakan yang sering ditemui
1. Lupa new = this jadi undefined (atau window di non-strict).
class Kotak { constructor(s) { this.s = s; } }
const k = Kotak(5); // ❌ TypeError di strict mode
const k = new Kotak(5); // ✅
2. Method "lepas" dari instance kehilangan this.
const k = new Kotak(5);
const f = k.luas;
f(); // ❌ this = undefined → error
// Solusi: bind atau arrow
const f = k.luas.bind(k); // ✅
3. super() WAJIB dipanggil sebelum this di constructor child.
class B extends A {
constructor(x) {
this.x = x; // ❌ ReferenceError
super();
this.x = x; // ✅
}
}
4. Class field tidak punya scope private secara default.
class Akun {
saldo = 0; // public — bisa diakses dari luar
#pin = 1234; // private (pakai `#`)
}
TL;DR: Class = blueprint untuk bikin banyak instance dengan struktur sama. constructor dipanggil otomatis pas new, this rujuk ke instance. extends mewarisi method dari parent class, super() panggil parent constructor (wajib sebelum akses this). #field untuk private. JavaScript class itu syntactic sugar di atas prototype chain — di balik layar tetap prototype-based.
🎯
classvs factory function vs object literal — pilih yang mana?
- Banyak instance dengan state berbeda (game enemies, todo items) →
class+new- Singleton config / API client → object literal (
const api = { fetch() {} })- Sekali pakai dengan closure privacy → factory function (
function buatCounter() { let n = 0; return { inc() { n++ } } })- Inheritance / extends needed (Cat extends Animal) →
class(sintaks paling clean)- Functional purity goal → factory + closure (avoid
this, avoidnew)Aturan modern: kalau gak butuh
newatauextends, sering object literal cukup.classshines kalau butuh banyak instance + inheritance. React class components udah deprecated demi function — tren JS modern condong functional, tapiclasstetap tool valid untuk kasus tertentu.