Dalam gambaran dunia nyata, banyak objek yang berbeda namun memiliki kesamaan atau kesamaan tertentu.
Misalnya mobil dengan motor mempunyai banyak kesamaan sebab objek itu merupakan kendaraan. Mobil merupakan kendaraan darat begitu pula dengan motor. Mungkin yang membedakan objek itu ialah jumlah roda dan kapasitas penumpang yang bisa ditampung.
Seperti halnya pada OOP, beberapa objek yang berbeda bisa jadi mempunyai kesamaan dalam hal tertentu. Di situlah konsep inheritance atau pewarisan harus diterapkan. Pewarisan bisa mencegah kita melakukan perulangan kode. Untuk lebih memahaminya lihatlah contoh bagan dalam sebuah kelas berikut:
Pada bagan di atas kita bisa lihat class Car, Motorcycle, Plane, dan Helicopter mempunyai banyak properti yang sama seperti lisencePlate, manufacture, dan engineActive. Kemudian mempunyai beberapa method yang sama seperti startEngines(), info(), dan parking().
Bila kita ubah diagram class Car di atas jadi sebuah kode maka kode terlihat semacam ini:
-
- class Car {
-
- constructor(licensePlate, manufacture, wheels) {
-
- this.licensePlate = licensePlate;
-
- this.manufacture = manufacture;
-
- this.wheels = wheels;
-
- this.engineActive = false;
-
- }
-
- startEngines() {
-
- console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);
-
- }
-
- info() {
-
- console.log(`Nomor Kendaraan: ${this.licensePlate}`);
-
- console.log(`Manufacture: ${this.manufacture}`);
-
- console.log(`Mesin: ${this.engineActive ? “Active”: “Inactive”}`);
-
- }
-
- droveOff() {
-
- console.log(`Kendaraan ${this.licensePlate} melesat!`)
-
- }
-
- openDoor() {
-
- console.log(`Membuka pintu!`)
-
- }
-
- parking() {
-
- console.log(`Kendaraan ${this.licensePlate} parkir!`);
-
- }
- }
Tak ada masalah dengan kode itu, namun bila kita akan membuat kelas lainnya seperti Motorcycle, Plane, dan Helicopter maka kita perlu menuliskan properti dan method yang sama secara berulang.
Dengan teknik inheritance, kita dapat mengelompokkan properti dan method yang sama. Caranya dengan membikin sebuah kelas baru yang kemudian akan diturunkan sifatnya pada class lain:
Saat class Vehicle sudah dibuat, kelas lainnya bisa melakukan extends pada kelas itu untuk mewarisi sifatnya. Dalam pewarisan, class Vehicle bisa disebut sebagai super atau parent class. Kelas yang mewarisi sifat dari parent class disebut dengan child class.
Pada JavaScript bila kita mau mewariskan sifat class, lakukan dengan keyword extends seperti berikut:
-
- class ChildClass extends ParentClass {
-
- }
Sebagai contoh ayo kita buat class Vehicle yang kemudian akan kita pakai sebagai parent class.
-
- class Vehicle {
-
- constructor(licensePlate, manufacture) {
-
- this.licensePlate = licensePlate;
-
- this.manufacture = manufacture;
-
- this.engineActive = false;
-
- }
-
- startEngines() {
-
- console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);
-
- }
-
- info() {
-
- console.log(`Nomor Kendaraan: ${this.licensePlate}`);
-
- console.log(`Manufacture: ${this.manufacture}`);
-
- console.log(`Mesin: ${this.engineActive ? “Active”: “Inactive”}`);
-
- }
-
- parking() {
-
- console.log(`Kendaraan ${this.licensePlate} parkir!`);
-
- }
- }
Lalu kita dapat membuat class Car sebagai child class dari Vehicle.
-
- class Car extends Vehicle {
-
- constructor(licensePlate, manufacture, wheels) {
-
- super(licensePlate, manufacture);
-
- this.wheels = wheels;
-
- }
-
- droveOff() {
-
- console.log(`Kendaraan ${this.licensePlate} melesat!`);
-
- }
-
- openDoor() {
-
- console.log(`Membuka pintu!`);
-
- }
- }
Dengan seperti itu selain properti dan method yang ada di dalamnya, class Car juga bisa mengakses semua properti dan method yang terdapat di class Vehicle.
-
- class Vehicle {
-
- constructor(licensePlate, manufacture) {
-
- this.licensePlate = licensePlate;
-
- this.manufacture = manufacture;
-
- this.engineActive = false;
-
- }
-
- startEngines() {
-
- console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);
-
- }
-
- info() {
-
- console.log(`Nomor Kendaraan: ${this.licensePlate}`);
-
- console.log(`Manufacture: ${this.manufacture}`);
-
- console.log(`Mesin: ${this.engineActive ? “Active”: “Inactive”}`);
-
- }
-
- parking() {
-
- console.log(`Kendaraan ${this.licensePlate} parkir!`);
-
- }
-
- }
-
- class Car extends Vehicle {
-
- constructor(licensePlate, manufacture, wheels) {
-
- super(licensePlate, manufacture);
-
- this.wheels = wheels;
-
- }
-
- droveOff() {
-
- console.log(`Kendaraan ${this.licensePlate} melesat!`);
-
- }
-
- openDoor() {
-
- console.log(`Membuka pintu!`);
-
- }
-
- }
-
- const car = new Car(“H121S”, “Honda”, 4);
-
- car.startEngines();
-
- /* output:
-
- Mesin kendaraan H121S dinyalakan!
- */
Oiya pada constructor class Car, kita melihat pemakaian super(), apa itu maksudnya? Keyword super dipakai untuk mengakses properti dan method yang ada di induk class saat berada di child class. Jadi super(lisencePlate, manufacture) di atas berarti kita mengakses constructor dari parent class dan mengirimkan lisencePlate, dan manufacture sebagai data yang diperlukan olehnya supaya objek (instance) Car berhasil dibuat.
Pemakaian super sangat berguna saat kita akan menjalankan method overriding pada method parent. Misalnya kita akan melakukan method overriding pada method info() dengan menambahkan informasi jumlah roda pada mobil, maka kita bisa melakukannya dengan semacam ini:
-
- class Car extends Vehicle {
-
- constructor(licensePlate, manufacture, wheels) {
-
- super(licensePlate, manufacture);
-
- this.wheels = wheels;
-
- }
-
- droveOff() {
-
- console.log(`Kendaraan ${this.licensePlate} melesat!`);
-
- }
-
- openDoor() {
-
- console.log(`Membuka pintu!`);
-
- }
-
- /* overriding method info dari parent class */
-
- info() {
-
- super.info();
-
- console.log(`Jumlah roda: ${this.wheels}`);
-
- }
-
- }
-
- const johnCar = new Car(“H121S”, “Honda”, 4);
-
- johnCar.info();
-
- /* output:
-
- Nomor Kendaraan: H121S
-
- Manufacture: Honda
-
- Mesin: Inactive
-
- Jumlah roda: 4
- */
Dalam melakukan pewarisan kelas, tak ada tingkatan yang membatasinya. Maksudnya, kita bisa mewariskan sifat kelas A pada kelas B, lalu kelas B mewarisi sifatnya kembali pada kelas C dan berikutnya. Seperti halnya dengan Nenek kita mewarisi sifatnya kepada orang tua kita kemudian orang tua kita mewarisi sifatnya kepada kita.
Sehingga bila dilihat dari bagan sebelumnya, class itu masih dapat digolongkan kembali jadi semacam ini: