
Belajar Dasar JavaScript: Pewarisan/Inheritance Kelas
Pewarisan (Inheritance) memungkinkan kita membuat kelas yang mewarisi anggota dari kelas lain. Kelas pewaris disebut kelas induk atau super class. Kelas yang mewarisi disebut kelas turunan atau sub class. Pewarisan merupakan fitur penting pada pemrograman OOP.
Dasar
Dalam bahasa JavaScript inheritance bisa dilakukan dengan keyword extends. Contohnya:
class Sepeda {
nama = "Sepeda";
hidupkan() {
console.log("Mesin hidupkan");
}
matikan() {
console.log("Mesin dimatikan");
}
matikanLampu() {
console.log("Lampu dihidupkan");
}
hidupkanLampu() {
console.log("Lampu dimatikan");
}
}
class Beat extends Sepeda {}
Pada contoh di atas kita membuat kelas bernama Sepeda dan Beat. Kelas Beat mewarisi kelas
Sepeda. Jadi, kelas Beat adalah kelas turunan dan kelas Sepeda adalah kelas induk. Kelas
Beat akan memiliki semua properti dan fungsi yang dimiliki kelas Sepeda.
Contohnya penggunaan kelas Beat:
const sepedaBeat = new Beat();
console.log(sepedaBeat.nama); // Sepeda
sepedaBeat.hidupkan(); // Mesin hidupkan
sepedaBeat.hidupkanLampu(); // Lampu dihidupkan
sepedaBeat.matikanLampu(); // Lampu dimatikan
sepedaBeat.matikan(); // Mesin dimatikan
Override Properti dan Fungsi
Override memungkinkan kita mengimplementasikan (mendeklarasikan) ulang fungsi atau properti pada kelas induk padahal fungsi/properti tersebut sudah ada di kelas induk. Contohnya:
class Beat extends Sepeda {
nama = "Beat";
hidupkan() {
super.hidupkan();
console.log(`Mesin ${this.nama} dimulai`);
}
matikan() {
console.log(`Mesin ${this.nama} dimatikan`);
super.matikan();
}
matikanLampu() {
console.log("Lampu tidak bisa dimatikan! Harus hidup");
}
hidupkanLampu() {
console.log("Lampu sudah dan jelas hidup!");
}
}
Pada contoh di atas kita mengoverride fungsi hidupkan, matikan, hidupkanLampu dan
matikanLampu. Saat keempat fungsi tersebut dipanggil maka yang dipanggil adalah fungsi dari kelas
anak turunan kelas induk. Kita juga mendeklarasikan ulang (override) properti nama.
super.hidupkan() akan memanggil fungsi hidupkan dari kelas Sepeda. super.matikan() akan
memanggil fungsi matikan dari kelas Sepeda. Jadi, keyword super digunakan untuk memanggil
fungsi dari kelas induk.
Saat kedua fungsi kita panggil akan muncul seperti ini:
const sepedaBeat = new Beat();
console.log(sepedaBeat.nama); // Beat
sepedaBeat.hidupkan();
// Mesin hidupkan
// Mesin Beat dimulai
sepedaBeat.hidupkanLampu(); // Lampu sudah dan jelas hidup!
sepedaBeat.matikanLampu(); // Lampu tidak bisa dimatikan! Harus hidup
sepedaBeat.matikan();
// Mesin Beat dimatikan
// Mesin dimatikan
Pada fungsi hidupkan dan matikan, fungsi kelas induk dipanggil karena kita memanggilnya
menggunakan super. Pada fungsi hidupkanLampu dan matikanLampu, fungsi kelas induk tidak
terpanggil. Kenapa? Karena kita tidak memanggilnya menggunakan super.
Saat mengoverride fungsi, memanggil fungsi induk dengan super itu tidak wajib.
Override Constructor
Untuk mengoverride constructor, caranya hampir sama dengan mengoverride fungsi. Contohnya seperti berikut:
class Mobil {
roda = 4;
constructor() {
console.log("Mobil dibuat");
}
}
class Toyota extends Mobil {
constructor() {
console.log("Membuat mobil Toyota");
console.log(`Mobil punya ${this.roda} `);
}
}
const mobil = new Toyota();
/*
Membuat mobil Toyota
Uncaught:
ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor
at new Toyota (REPL13:4:17)
*/
Kenapa terjadi error? Jadi saat mengoverride constuctor, sebelum mengakses this kita harus
memanggil konstruktor kelas induk dengan super. Agar tidak terjadi error, maka kode dirubah
seperti berikut:
class Toyota extends Mobil {
constructor() {
super();
console.log("Membuat mobil Toyota");
console.log(`Mobil punya ${this.roda} `);
}
}
const mobil = new Toyota();
/*
Mobil dibuat
Membuat mobil Toyota
Mobil punya 4
*/
Anggota Privat
Kelas turunan tidak dapat mengakses anggota privat dari kelas induk. Contohnya seperti ini:
class Laptop {
#ram = 8;
#getTemp() {
return 20;
}
}
class Asus extends Laptop {
getRam() {
return super.#ram;
}
getTemp() {
return super.#getTemp();
}
}
const laptop = new Asus()
// Uncaught SyntaxError: Unexpected private field
console.log(laptop.getRam())
console.log(laptop.getTemp())
Ternyata saat kita membuat objek dari kelas Asus saja sudah terjadi error karena kita mengakses
anggota privat dari kelas induk.