Senin, 27 April 2020

Static Method didalam Class Javascript

Static Method didalam Class Javascript

Seluruh kendaraan pasti butuh yang namanya perawatan bukan? Jika iya, tentu kita perlu membuat method repair untuk memperbaiki kendaraan tersebut. 
Dalam analogi dunia nyata, ketika kendaraan mengalami kerusakan maka kendaraan tersebut akan diperbaiki di bengkel (factory), sehingga kita perlu membuat class baru yang berperan sebagai factory, sebutlah class tersebut VehicleFactory. Di dalam kelas VehicleFactory terdapat satu method repair() yang dapat menerima banyak kendaraan sebagai parameternya.

  1. class Vehicle {

  2.   constructor(licensePlate, manufacture) {

  3.       this.licensePlate = licensePlate;

  4.       this.manufacture = manufacture;

  5.       this.engineActive = false;

  6.   }

  7.    /*

  8.   kode lainnya

  9.   */

  10. }

  11.  

  12. /* kode lainnya dalam pembuatan class Car, 

  13. Motorcycle, dsb. */

  14.  

  15.  

  16. class VehicleFactory {

  17.  repair(vehicles) {

  18.     vehicles.forEach(vehicle => {

  19.       console.log(`Kendaraan ${vehicle.licensePlate} sedang melakukan perawatan`)

  20.     })

  21.   }

  22. }


Untuk mengakses method dari class, sejauh ini kita perlu membuat instance dari classnya terlebih dahulu. Sehingga untuk memanggil repair(), kita perlu membuat instance dari class VehicleFactory

  1. const johnCar = new Car("H121S", "Honda", 4);

  2. const tomMotor = new Motorcycle("GF121J", "Yamaha", 2);

  3. const dimasCar = new Car("TA1408K", "Tesla", 4);

  4.  

  5. /* Membuat instance untuk memanggil fungsi repair */

  6. const vehicleFactory = new VehicleFactory();

  7. vehicleFactory.repair([johnCar, tomMotor, dimasCar]);

  8.  

  9. /* output:

  10. Kendaraan H121S sedang melakukan perawatan

  11. Kendaraan GF121J sedang melakukan perawatan

  12. Kendaraan TA1408K sedang melakukan perawatan

  13. */


Kode tersebut berjalan sesuai harapan namun tidak efektif. Mengapa? Karena kita perlu membuat instance untuk sekedar memanggil satu fungsi dari class-nya tersebut. Membuat instance adalah membuat sebuah objek baru yang terbentuk melalui blueprint sehingga membutuhkan memori ekstra. Jika kita dapat mengakses method tersebut tanpa melalui instance mengapa tidak? Pada kasus inilah kita membutuhkan sebuah static method. Static method merupakan method yang tidak dapat dipanggil oleh instance dari class, namun dapat dipanggil melalui class-nya sendiri.
Pada ES6 class kita dapat membuat static method dengan menambahkan keyword static sebelum deklarasi method-nya:

  1. class Vehicle {

  2.   constructor(licensePlate, manufacture) {

  3.       this.licensePlate = licensePlate;

  4.       this.manufacture = manufacture;

  5.       this.engineActive = false;

  6.   }

  7.    /*

  8.   kode lainnya

  9.   */

  10. }

  11.  

  12. /* kode lainnya dalam pembuatan class Car, 

  13. Motorcycle, dsb. */

  14.  

  15. class VehicleFactory {

  16.  static repair(vehicles) {

  17.     vehicles.forEach(vehicle => {

  18.       console.log(`Kendaraan ${vehicle.licensePlate} sedang melakukan perawatan`)

  19.     })

  20.   }

  21. }


Kemudian untuk memanggil methodnya kita bisa panggil melalui class Vehicle kemudian repair().
Seluruh kendaraan pasti butuh yang namanya perawatan bukan? Jika iya, tentu kita perlu membuat method repair untuk memperbaiki kendaraan tersebut. Dalam analogi dunia nyata, ketika kendaraan mengalami kerusakan maka kendaraan tersebut akan diperbaiki di bengkel (factory), sehingga kita perlu membuat class baru yang berperan sebagai factory, sebutlah class tersebut VehicleFactory. Di dalam kelas VehicleFactory terdapat satu method repair() yang dapat menerima banyak kendaraan sebagai parameternya. 

  1. class Vehicle {

  2.   constructor(licensePlate, manufacture) {

  3.       this.licensePlate = licensePlate;

  4.       this.manufacture = manufacture;

  5.       this.engineActive = false;

  6.   }

  7.    /*

  8.   kode lainnya

  9.   */

  10. }

  11.  

  12. /* kode lainnya dalam pembuatan class Car, 

  13. Motorcycle, dsb. */

  14.  

  15.  

  16. class VehicleFactory {

  17.  repair(vehicles) {

  18.     vehicles.forEach(vehicle => {

  19.       console.log(`Kendaraan ${vehicle.licensePlate} sedang melakukan perawatan`)

  20.     })

  21.   }

  22. }


Untuk mengakses method dari class, sejauh ini kita perlu membuat instance dari classnya terlebih dahulu. Sehingga untuk memanggil repair(), kita perlu membuat instance dari class VehicleFactory

  1. const johnCar = new Car("H121S", "Honda", 4);

  2. const tomMotor = new Motorcycle("GF121J", "Yamaha", 2);

  3. const dimasCar = new Car("TA1408K", "Tesla", 4);

  4.  

  5. /* Membuat instance untuk memanggil fungsi repair */

  6. const vehicleFactory = new VehicleFactory();

  7. vehicleFactory.repair([johnCar, tomMotor, dimasCar]);

  8.  

  9. /* output:

  10. Kendaraan H121S sedang melakukan perawatan

  11. Kendaraan GF121J sedang melakukan perawatan

  12. Kendaraan TA1408K sedang melakukan perawatan

  13. */


Kode tersebut berjalan sesuai harapan namun tidak efektif. Mengapa? Karena kita perlu membuat instance untuk sekedar memanggil satu fungsi dari class-nya tersebut. Membuat instance adalah membuat sebuah objek baru yang terbentuk melalui blueprint sehingga membutuhkan memori ekstra. Jika kita dapat mengakses method tersebut tanpa melalui instance mengapa tidak? Pada kasus inilah kita membutuhkan sebuah static method. Static method merupakan method yang tidak dapat dipanggil oleh instance dari class, namun dapat dipanggil melalui class-nya sendiri.
Pada ES6 class kita dapat membuat static method dengan menambahkan keyword static sebelum deklarasi method-nya:

  1. class Vehicle {

  2.   constructor(licensePlate, manufacture) {

  3.       this.licensePlate = licensePlate;

  4.       this.manufacture = manufacture;

  5.       this.engineActive = false;

  6.   }

  7.    /*

  8.   kode lainnya

  9.   */

  10. }

  11.  

  12. /* kode lainnya dalam pembuatan class Car, 

  13. Motorcycle, dsb. */

  14.  

  15. class VehicleFactory {

  16.  static repair(vehicles) {

  17.     vehicles.forEach(vehicle => {

  18.       console.log(`Kendaraan ${vehicle.licensePlate} sedang melakukan perawatan`)

  19.     })

  20.   }

  21. }


Kemudian untuk memanggil methodnya kita bisa panggil melalui class Vehicle kemudian repair().
Inheritance Dalam OOP Javascript (Parent Class & Child Class)

Inheritance Dalam OOP Javascript (Parent Class & Child Class)

Dalam gambaran dunia nyata, banyak objek yang berbeda tetapi punya kesamaan atau kemiripan tertentu. 

Contohnya mobil dengan motor memiliki banyak kesamaan karena objek tersebut merupakan kendaraan. Mobil merupakan kendaraan darat begitu juga dengan motor. Mungkin yang membedakan objek tersebut adalah jumlah roda dan kapasitas penumpang yang dapat ditampung. 
Sama halnya pada OOP, beberapa objek yang berbeda bisa saja memiliki kesamaan dalam hal tertentu. Di situlah konsep inheritance atau pewarisan harus diterapkan. Pewarisan dapat mencegah kita melakukan perulangan kode. Untuk lebih memahaminya lihatlah contoh bagan pada sebuah kelas berikut:
2020031216412445298e8b960399d06bf16eab880badd8.png
Pada bagan di atas kita dapat lihat class CarMotorcyclePlane, dan Helicopter memiliki banyak properti yang sama seperti lisencePlatemanufacture, dan engineActive. Kemudian memiliki beberapa method yang sama seperti startEngines()info(), dan parking().
Jika kita ubah diagram class Car di atas menjadi sebuah kode maka kode tampak seperti ini:

  1. class Car {

  2.     constructor(licensePlate, manufacture, wheels) {

  3.         this.licensePlate = licensePlate;

  4.         this.manufacture = manufacture;

  5.         this.wheels = wheels;

  6.         this.engineActive = false;

  7.     }

  8.     

  9.     startEngines() {

  10.         console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);

  11.     }

  12.     

  13.     info() {

  14.         console.log(`Nomor Kendaraan: ${this.licensePlate}`);

  15.         console.log(`Manufacture: ${this.manufacture}`);

  16.         console.log(`Mesin: ${this.engineActive ? "Active": "Inactive"}`);

  17.     }

  18.     

  19.     droveOff() {

  20.         console.log(`Kendaraan ${this.licensePlate} melaju!`)

  21.     }

  22.     

  23.     openDoor() {

  24.         console.log(`Membuka pintu!`)

  25.     }

  26.     

  27.     parking() {

  28.         console.log(`Kendaraan ${this.licensePlate} parkir!`);

  29.     }

  30. }


Tidak ada masalah dengan kode tersebut, tetapi jika kita akan membuat kelas lainnya seperti MotorcyclePlane, dan Helicopter maka kita harus menuliskan properti dan method yang sama secara berulang. 
Dengan teknik inheritance, kita bisa mengelompokkan properti dan method yang sama. Caranya dengan membuat sebuah kelas baru yang nantinya akan diturunkan sifatnya pada class lain:
2020031216453692b650a5c0e0b6c77a74227d408e5757.png
Ketika class Vehicle telah dibuat, kelas lainnya dapat melakukan extends pada kelas tersebut untuk mewarisi sifatnya. Dalam pewarisan, class Vehicle dapat disebut sebagai super atau parent class. Kelas yang mewarisi sifat dari parent class disebut dengan child class.
Pada JavaScript jika kita ingin mewariskan sifat class, lakukan dengan keyword extends seperti berikut:

  1. class ChildClass extends ParentClass {

  2.     

  3. }


Sebagai contoh mari kita buat class Vehicle yang nantinya akan kita gunakan sebagai parent class.

  1. class Vehicle {

  2.     constructor(licensePlate, manufacture) {

  3.         this.licensePlate = licensePlate;

  4.         this.manufacture = manufacture;

  5.         this.engineActive = false;

  6.     }

  7.     

  8.     startEngines() {

  9.         console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);

  10.     }

  11.     

  12.     info() {

  13.         console.log(`Nomor Kendaraan: ${this.licensePlate}`);

  14.         console.log(`Manufacture: ${this.manufacture}`);

  15.         console.log(`Mesin: ${this.engineActive ? "Active": "Inactive"}`);

  16.     }

  17.     

  18.     parking() {

  19.         console.log(`Kendaraan ${this.licensePlate} parkir!`);

  20.     }

  21. }


Kemudian kita bisa membuat class Car sebagai child class dari Vehicle.

  1. class Car extends Vehicle {

  2.    constructor(licensePlate, manufacture, wheels) {

  3.        super(licensePlate, manufacture);

  4.        this.wheels = wheels;

  5.    }

  6.  

  7.    droveOff() {

  8.      console.log(`Kendaraan ${this.licensePlate} melaju!`);

  9.    }

  10.  

  11.    openDoor() {

  12.      console.log(`Membuka pintu!`);

  13.    }

  14. }


Dengan begitu selain properti dan method yang terdapat di dalamnya, class Car juga dapat mengakses seluruh properti dan method yang terdapat pada class Vehicle.

  1. class Vehicle {

  2.    constructor(licensePlate, manufacture) {

  3.        this.licensePlate = licensePlate;

  4.        this.manufacture = manufacture;

  5.        this.engineActive = false;

  6.    }

  7.   

  8.    startEngines() {

  9.        console.log(`Mesin kendaraan ${this.licensePlate} dinyalakan!`);

  10.    }

  11.   

  12.    info() {

  13.        console.log(`Nomor Kendaraan: ${this.licensePlate}`);

  14.        console.log(`Manufacture: ${this.manufacture}`);

  15.        console.log(`Mesin: ${this.engineActive ? "Active": "Inactive"}`);

  16.    }

  17.   

  18.    parking() {

  19.        console.log(`Kendaraan ${this.licensePlate} parkir!`);

  20.    }

  21. }

  22.  

  23. class Car extends Vehicle {

  24.    constructor(licensePlate, manufacture, wheels) {

  25.        super(licensePlate, manufacture);

  26.        this.wheels = wheels;

  27.    }

  28.  

  29.    droveOff() {

  30.      console.log(`Kendaraan ${this.licensePlate} melaju!`);

  31.    }

  32.  

  33.    openDoor() {

  34.      console.log(`Membuka pintu!`);

  35.    }

  36. }

  37.  

  38. const car = new Car("H121S", "Honda", 4);

  39. car.startEngines();

  40.  

  41. /* output:

  42. Mesin kendaraan H121S dinyalakan!

  43. */


Oiya pada constructor class Car, kita melihat penggunaan super(), apa itu maksudnya? Keyword super digunakan untuk mengakses properti dan method yang ada pada induk class ketika berada pada child class. Jadi super(lisencePlate, manufacture) di atas berarti kita mengakses constructor dari parent class dan mengirimkan lisencePlate, dan manufacture sebagai data yang dibutuhkan olehnya agar objek (instanceCar berhasil dibuat.
Penggunaan super sangat berguna ketika kita hendak menjalankan method overriding pada method parent. Contohnya kita akan melakukan method overriding pada method info() dengan menambahkan informasi jumlah roda pada mobil, maka kita dapat melakukannya dengan seperti ini:

  1. class Car extends Vehicle {

  2.    constructor(licensePlate, manufacture, wheels) {

  3.        super(licensePlate, manufacture);

  4.        this.wheels = wheels;

  5.    }

  6.  

  7.    droveOff() {

  8.      console.log(`Kendaraan ${this.licensePlate} melaju!`);

  9.    }

  10.  

  11.    openDoor() {

  12.      console.log(`Membuka pintu!`);

  13.    }

  14.  

  15.    /* overriding method info dari parent class */

  16.    info() {

  17.      super.info();

  18.      console.log(`Jumlah roda: ${this.wheels}`);

  19.    }

  20. }

  21.  

  22. const johnCar = new Car("H121S", "Honda", 4);

  23. johnCar.info();

  24.  

  25. /* output:

  26. Nomor Kendaraan: H121S

  27. Manufacture: Honda

  28. Mesin: Inactive

  29. Jumlah roda: 4

  30. */


Dalam melakukan pewarisan kelas, tidak ada tingkatan yang membatasinya. Maksudnya, kita dapat mewariskan sifat kelas A pada kelas B, lalu kelas B mewarisi sifatnya kembali pada kelas C dan selanjutnya. Sama halnya dengan Nenek kita mewarisi sifatnya kepada orang tua kita kemudian orang tua kita mewarisi sifatnya kepada kita. 
Sehingga jika dilihat dari bagan sebelumnya, class tersebut masih bisa dikelompokkan kembali menjadi seperti ini:
20200312165044bad7c7034d9d728224594a2fde9a7693.png
Cara Menambahkan Method didalam Class Javascript

Cara Menambahkan Method didalam Class Javascript

Untuk menambahkan method pada class, kita juga cukup menuliskannya pada body class, tidak perlu melalui prototype seperti menggunakan constructor function.


  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7.     

  8.     startEngines() {

  9.         console.log("Mesin dinyalakan");

  10.         this.enginesActive = true;

  11.     }

  12.     

  13.     info() {

  14.         console.log(`Manufacture: ${this.manufacture}`);

  15.         console.log(`Color: ${this.color}`);

  16.         console.log(`Engines: ${this.manufacture ? "Active" : "Inactive"}`);

  17.     }

  18. }

  19.  

  20. const johnCar = new Car("Honda", "Red");

  21.  

  22. johnCar.startEngines();

  23. johnCar.info();

  24.  

  25.  

  26. /* output:

  27. Mesin dinyalakan

  28. Manufacture: Honda

  29. Color: Red

  30. Engines: Active

  31. */


Dengan menggunakan class, walaupun kita menuliskan method pada body class, namun method tersebut tetap berada pada prototype chain miliki instance yang terbuat. Kita bisa melihat bagaimana objek yang dibuat menggunakan class pada console browser
20200312163128914b6b721efd67a21c9e124a0111699e.gif