Di lesson berikutnya kamu akan belajar class — tapi sebelum itu, penting untuk tahu apa yang sebenarnya bekerja di balik layar. Jawabannya: prototypes. Kenapa penting? Karena hampir semua kebingungan soal this, inheritance, dan instanceof di JavaScript berakar di sini. Paham prototype = paham fondasinya.
Ide Inti
Setiap object JavaScript punya satu link tersembunyi ke object lain — itu disebut prototype-nya. Kalau kamu mencari property di suatu object dan tidak ketemu, JS otomatis cek ke prototype-nya. Kalau masih tidak ketemu, cek prototype dari prototype. Begitu seterusnya, sampai menemukan null.
Contoh Sederhana
function Hewan(nama) {
this.nama = nama;
}
Hewan.prototype.sapa = function() {
return "Saya " + this.nama;
};
const kucing = new Hewan("Kitty");
kucing.sapa(); // "Saya Kitty"
kucing tidak punya method sapa sendiri — method itu hidup di Hewan.prototype. JavaScript menemukannya lewat prototype chain.
Prototype Chain
kucing.sapa(); // ditemukan di Hewan.prototype
kucing.toString(); // ditemukan di Object.prototype
kucing.terbang; // undefined (tidak ada di chain manapun)
Kenapa Ini Penting untuk Lesson Berikutnya
class di JavaScript hanyalah syntactic sugar untuk pola prototype di atas. Kode berikut identik secara semantik:
// Pakai class (ES6+)
class Hewan {
constructor(nama) { this.nama = nama; }
sapa() { return "Saya " + this.nama; }
}
Saat kamu menulis class, JavaScript tetap bikin function dan prototype di baliknya. Jadi ketika nanti di lesson Classes kamu ketemu istilah seperti "method lives on the prototype" — sekarang kamu tahu persis apa artinya.
Method penting:
Object.create(proto)— buat object dengan prototype tertentuObject.getPrototypeOf(obj)— lihat prototype objectobj.hasOwnProperty(key)— cek property milik sendiri (bukan inherited)
null (return undefined).🎭 Analogi sehari-hari
Prototype chain = silsilah keluarga. Anak butuh sesuatu? Cek ke ayah dulu. Tidak ada? Cek kakek. Tidak ada juga? Cek buyut. Sampai ujung silsilah (null). Kalau ketemu, ambil. Kalau habis silsilah, return undefined.
Object.prototype = nenek moyang semua object — di situ toString, hasOwnProperty, dll hidup.
⚠️ Jebakan yang sering ditemui
__proto__deprecated — masih jalan tapi jangan dipakai. PakaiObject.getPrototypeOf(obj)danObject.setPrototypeOf(obj, proto).- Modifikasi
Object.prototype= GLOBAL POLLUTION — bug yang bisa rusak seluruh app. JANGAN. instanceofcek prototype chain — kalau B extends A,b instanceof Atrue. Tapiinstanceof Arraytidak reliable lintas iframe — pakaiArray.isArray().- Method di prototype shared = hemat memory, tapi
thisjadi penting. Ubah method via instanceobj.method = ...cuma di instance itu. for...inenumerate prototype chain — termasuk inherited properties. Filter pakaiobj.hasOwnProperty(key)atau pakaiObject.keys(obj).- Constructor function (
function Foo() {}) butuhnew— tanpanew,this= window/undefined. - Class adalah syntactic sugar —
class Foodi balik layar tetap function + prototype.Foo.prototype.bar = ...tetap jalan.
TL;DR: Tiap object punya link tersembunyi __proto__ ke object lain — itu prototype chain. Cari property tidak ketemu → JS naik chain otomatis sampai ketemu atau null. class JavaScript = syntactic sugar di atas pattern ini. Method di Hewan.prototype = shared antar semua instance (hemat memory). instanceof cek chain. Jangan modify Object.prototype (global pollution). Pakai Object.getPrototypeOf(), bukan __proto__ deprecated.