Satu Class Dibangun di Atas Class Lain
Inheritance memungkinkan sebuah class memulai dari cetak biru class lain lalu memperluasnya. Kamu mendapat setiap field dan method milik parent secara gratis, dan bisa menambah atau mengubah apa pun yang kamu butuhkan:
Dog extends Animal berarti: "Dog adalah Animal, ditambah sedikit lagi." rex tidak punya method speak sendiri, tetapi pencariannya berlanjut ke Animal, yang memilikinya. Kelanjutan pencarian itulah seluruh mekanismenya: ini hanyalah rantai prototype dengan sintaks yang lebih enak.
super di Constructor
Subclass yang punya constructor sendiri wajib mengikuti satu aturan ketat: panggil super(...) sebelum menyentuh this. super menjalankan constructor milik parent, yang sebenarnya membuat dan menginisialisasi objeknya:
Lewatkan baris super(name) dan kamu akan mendapat ReferenceError begitu mencoba membaca atau mengisi this. Engine sama sekali tidak mau memberimu this sebelum parent mendapat gilirannya.
Kalau subclass tidak mendeklarasikan constructor sendiri, JavaScript membuatkan satu yang meneruskan semua argumen ke super. Jadi kamu hanya perlu menulisnya saat menambahkan field atau melakukan persiapan tambahan.
Override Method
Subclass bisa mendefinisikan ulang method apa pun yang diwarisinya. Yang paling dekat di rantai yang menang:
Tidak ada sihir di sini: saat kamu memanggil speak() pada Dog, engine mencari speak di instance, lalu di Dog.prototype, menemukannya, dan berhenti. Pencariannya tidak pernah sampai ke Animal.prototype.
Memperluas, Bukan Mengganti: super.method()
Kadang kamu tidak ingin mengganti method milik parent, melainkan menambahinya. super.method(...) memanggil versi milik parent dari dalam override:
Di sinilah inheritance menunjukkan manfaatnya: subclass memakai ulang logika parent alih-alih menyalinnya. Kalau Animal.describe berubah nanti, Dog.describe ikut mendapat perubahan itu secara gratis.
super bisa dipakai di method mana pun, bukan hanya di constructor. Ia selalu merujuk ke versi milik class parent dari apa pun yang sedang kamu panggil.
instanceof dan Rantainya
instanceof mengecek apakah rantai prototype sebuah objek mencakup class tertentu. Setiap instance subclass juga merupakan instance dari parent-parent-nya:
Keempatnya bernilai true. Rantainya Puppy -> Dog -> Animal -> Object, dan instanceof menelusurinya. Berguna untuk pengecekan tipe, walaupun dalam praktiknya kamu akan lebih jarang memakainya daripada yang kamu kira: kebanyakan kode cukup memanggil method dan membiarkan polimorfisme menangani sisanya.
Contoh yang Sedikit Lebih Besar
Pola yang umum: class dasar dengan logika bersama, dan beberapa subclass yang mengkhususkannya.
Perhatikan bahwa describe berada di Shape dan tidak pernah perlu ditulis ulang. Ia hanya memanggil this.area(), yang mengarah ke subclass yang tepat saat runtime. Itulah polimorfisme: tempat pemanggilan yang sama, perilaku berbeda tergantung objek sebenarnya.
Inheritance vs Komposisi
Inheritance menggoda karena terasa produktif: satu baris memberimu setumpuk method. Tetapi ia sulit dirawat saat hierarkinya tumbuh.
Pegangan praktisnya: pakai extends saat hubungannya jelas "X adalah sebuah Y" dan subclass memang memakai sebagian besar perilaku parent-nya. Saat kamu memakai inheritance hanya untuk berbagi satu atau dua method helper, utamakan komposisi: beri class itu sebuah field yang memegang objek helper-nya:
Pohon inheritance yang dalam (Animal -> Mammal -> Dog -> WorkingDog -> PoliceDog) terlihat rapi di diagram tetapi menyakitkan di kode: perubahan di dekat akarnya merambat tanpa bisa ditebak ke setiap turunannya. Kebanyakan codebase yang sehat hanya sedalam satu atau dua tingkat dan mengandalkan komposisi untuk sisanya.
Berikutnya: Static Member
Semua yang ada di dokumentasi ini berada di instance, yaitu method yang kamu panggil lewat new Thing().something(). Kadang kamu ingin method atau data yang dimiliki class itu sendiri, bukan instance tertentu. Untuk itulah static ada, dan itu dibahas berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara kerja inheritance di JavaScript?
Sebuah class bisa mewarisi class lain dengan extends. Subclass mendapat setiap method dan field milik parent-nya, dan bisa menambahkan miliknya sendiri atau meng-override yang sudah ada. Di baliknya, JavaScript menautkan prototype subclass ke prototype parent, sehingga pencarian method otomatis berlanjut ke atas.
Apa fungsi super di JavaScript?
super(...) memanggil constructor milik class parent, dan kamu wajib memanggilnya sebelum memakai this di constructor subclass. super.method(...) memanggil versi method milik parent, dan begitulah caramu memperluas perilaku alih-alih menggantinya sepenuhnya.
Sebaiknya memakai inheritance atau komposisi di JavaScript?
Pakai inheritance saat ada hubungan 'adalah sebuah' yang nyata dan subclass memakai sebagian besar perilaku parent-nya. Pakai komposisi, yaitu objek yang memegang objek lain, saat kamu hanya ingin berbagi fungsionalitas. Hierarki class yang dalam cenderung sulit dirawat seiring waktu; kebanyakan codebase sungguhan hanya sedalam satu atau dua tingkat.