Senin, 27 April 2020

Property Accessor didalam Object Class Javascript

Melalui objek class kita juga dapat mengubah nilai properti seperti ini:


  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7. }

  8.  

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

  10. console.log(`Warna mobil: ${johnCar.color}`); // output -> Warna Mobil: Red

  11.  

  12. johnCar.color = "White"; // Mengubah nilai properti color menjadi white

  13.  

  14. console.log(`Warna mobil: ${johnCar.color}`); // output -> Warna Mobil: White


Dengan class kita juga dapat mengimplementasi getter/setter sebuah properti menjadi sebuah method seperti ini:

  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this._color = color;

  5.         this.enginesActive = false;

  6.     }

  7.     

  8.     get color() {

  9.         return `Warna mobile ${this._color}`;

  10.     }

  11.     

  12.     set color(value) {

  13.         console.log(`Warna mobil diubah dari ${this._color} menjadi ${value}`);

  14.         this._color = value;

  15.     }

  16. }

  17.  

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

  19. console.log(johnCar.color); // output -> Warna Mobil: Red

  20. johnCar.color = "White"; // Mengubah nilai properti color menjadi white

  21. console.log(johnCar.color); // output -> Warna Mobil: White


Perhatikan juga ketika kita menerapkan getter/setter pada properti class. Kita perlu mengubah atau membedakan penamaan properti aslinya dengan property accessor yang kita buat. Berdasarkan code convention yang ada kita perlu mengubah properti asli class-nya dengan menambahkan underscore di depan nama propertinya (_color). Tanda underscore berfungsi sebagai tanda bahwa properti _color tidak sebaiknya diakses langsung, namun harus melalui property accessor (getter/setter)

Cara Membuat Instance di Dalam Class Javascript

Setelah kita membuat class pada JavaScript, lantas bagaimana cara membuat instance dari class tersebut? 

Tapi sebelumnya, apa itu instance? Instance merupakan objek yang memiliki properti dan method yang telah ditentukan oleh blueprint-nya (class), atau singkatnya adalah objek yang merupakan hasil realisasi dari sebuah blueprint.
Sama seperti constructor function, untuk membuat instance dari class pada ES6 kita gunakan keyword new.

  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7. }

  8.  

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


Pembuatan class menggunakan ES6 lebih ketat dibandingkan dengan constructor function, di mana dalam pembuatan instance wajib menggunakan keyword new. Jika kita tidak menuliskannya, maka akan terjadi error seperti ini:

  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7. }

  8.  

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

  10.  

  11. /* error:

  12. TypeError: Class constructor Car cannot be invoked without 'new'

  13. */


Kita juga dapat membuat banyak instance dari class yang sama, dan tentunya objek yang kita buat memiliki karakteristik (properti dan method) yang sama. Walaupun sama, namun nilai dari propertinya bersifat unik atau bisa saja berbeda. Contohnya seperti ini:

  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7. }

  8.  

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

  10. const adamCar = new Car("Tesla", "Black");

  11.  

  12. console.log(johnCar.manufacture);

  13. console.log(adamCar.manufacture);

  14.  

  15. /* output:

  16. Honda

  17. Tesla

  18. */


Variabel johnCar dan adamCar merupakan sebuah objek dari Car. Tentu keduanya akan memiliki properti manufacturecolor, dan enginesActive. Namun pada output kita melihat bahwa nilai dari properti kedua objek tersebut berbeda, karena kita dapat memberikan nilai yang berbeda pada saat objeknya dibuat.

Constructor didalam Javascript

Deklarasi class menggunakan ES6 memiliki sifat yang sama seperti pembuatan class menggunakan function constructor (seperti contoh sebelumnya). 

Namun alih-alih menggunakan function constructor dalam menginisialisasi propertinya, class ini memisahkan constructornya dan ditempatkan pada body class menggunakan method spesial yang dinamakan constructor

  1. class Car {

  2.     constructor(manufacture, color) {

  3.         this.manufacture = manufacture;

  4.         this.color = color;

  5.         this.enginesActive = false;

  6.     }

  7. }


constructor biasanya hanya digunakan untuk menetapkan nilai awal pada properti berdasarkan nilai yang dikirimkan pada constructor. Namun sebenarnya kita juga dapat menuliskan logika di dalam constructor jika memang kita memerlukan beberapa kondisi sebelum nilai properti diinisialisasi.
Kita juga melihat penggunaan this pada constructor. Konteks dalam class, keyword this merujuk pada  instance dari class tersebut. Sehingga this dapat digunakan untuk mengelola properti yang terdapat pada instance.

Apa Itu Class di Javascript?

Dalam paradigma Object-Oriented Programming (OOP), class merupakan sebuah blueprint yang dapat dikembangkan untuk membuat sebuah objek.
Blueprint ini merupakan sebuah template yang di dalamnya menjelaskan seperti apa perilaku dari objek itu (berupa properti ataupun method).
2020031400163071868d05b7fff5009d785e8cb61890d3.png
Paradigma OOP selalu digambarkan dengan kehidupan nyata. Visualisasi di atas mencontohkan gambaran umum OOP di mana terdapat sebuah blueprint kucing, nilai yang dimiliki kucing, dan kemampuan yang dapat dilakukan olehnya. 
Dalam OOP blueprint tersebut dikenal dengan class (kelas), nilai yang dimiliki olehnya dikenal dengan properti, kemampuan yang dimilikinya dikenal sebagai behaviour/method dan realisasi dari sebuah blueprint tersebut disebut instance.
Dalam dunia pemrograman khususnya dalam paradigma OOP, kita sering membuat banyak objek dengan jenis yang sama. Dengan membuat blueprint ini kita dapat mengurangi duplikasi kode dalam membuat objek yang serupa
Kebanyakan bahasa pemrograman memanfaatkan class dalam penerapan paradigma OOP. Pada JavaScript tidak ada konsep class murni bahkan hingga saat ini. Namun bukan berarti kita tidak bisa menerapkan paradigma OOP sepenuhnya.
Seperti yang kita ketahui, class pada OOP merupakan sebuah blueprint. Jika berbicara mengenai blueprint, JavaScript memiliki konsep untuk membuatnya tanpa melalui class. Konsep tersebut adalah prototype. Sejak awal developer menggunakan konsep ini dalam menerapkan paradigma OOP di JavaScript.
Walaupun dapat menggantikan class, konsep prototype tidak serupa dengan class pada bahasa lain. Terlebih pada penulisan sintaknya. Hal ini menjadikan banyak developer kebingungan khususnya developer yang dasarnya dari bahasa class basis (seperti Java, C++, C#, Swift, etc.). Meskipun banyak juga developer yang merasa bahwa class tidak diperlukan pada JavaScript, namun fitur class ini tetap menjadi salah satu yang dikembangkan pada ECMAScript 6.

A Class Before ES6

Sebelum ES6, Hal yang paling mendekati dengan class yaitu membuat sebuah objek menggunakan constructor function dan keyword new, lalu untuk menambahkan method kita gunakan konsep prototype.

  1. function Car(manufacture, color) {

  2.     this.manufacture = manufacture;

  3.     this.color = color;

  4.     this.enginesActive = false;

  5. }

  6.  

  7. Car.prototype.startEngines = function () {

  8.     console.log('Mobil dinyalakan...');

  9.     this.enginesActive = true;

  10. };

  11.  

  12. Car.prototype.info = function () {

  13.     console.log("Manufacture: " + this.manufacture);

  14.     console.log("Color: " + this.color);

  15.     console.log("Engines: " + (this.enginesActive ? "Active" : "Inactive"));

  16. }

  17.  

  18. var johnCar = new Car("Honda", "Red");

  19. johnCar.startEngines();

  20. johnCar.info();

  21.  

  22. /* output: 

  23. Mobil dinyalakan...

  24. Manufacture: Honda

  25. Color: Red

  26. Engines: Active

  27. */


Pada kode di atas Car merupakan constructor function yang akan membuat instance Car baru setiapkan kode new Car() dieksekusi. Melalui Car.prototype, method startEngines() dan carInfo()  diwarisi pada setiap instance Car yang dibuat, sehingga johnCar (sebagai instance Car) dapat mengakses kedua method tersebut.
Teknik dasar ini yang digunakan dalam membuat class di JavaScript sebelum ES6.
“Mengapa method pada instance harus disimpan pada prototype atau __proto__ ? Mengapa tidak disimpan pada constructor sama seperti properti? 
Alasannya adalah jika kita menyimpan method pada constructor maka method tersebut akan selalu dibuat ketika instance dibuat. Ini bukan pendekatan yang baik karena jika method memiliki kode yang banyak, maka akan memakan memori yang banyak.
Sedangkan jika menggunakan prototype, method hanya dibuat satu kali. Dan method tersebut diwarisi kepada setiap instance yang dibuat.”

ES6 Classes

Dengan hadirnya class pada ES6, pembuatan class di JavaScript menjadi lebih mudah dan juga penulisannya mirip seperti bahasa pemrograman lain berbasis class. Pembuatan class pada ES6 menggunakan keyword class itu sendiri kemudian diikuti dengan nama class-nya. 

  1. class Car {

  2.     

  3.     // Sama seperti function constructor

  4.     constructor(manufacture, color) {

  5.         this.manufacture = manufacture;

  6.         this.color = color;

  7.         this.enginesActive = false;

  8.     }

  9.     

  10.     // Sama seperti Car.prototype.startEngine

  11.     startEngines() {

  12.         console.log('Mobil dinyalakan...');

  13.         this.enginesActive = true;

  14.     }

  15.     

  16.     // Sama seperti car.prototype.info

  17.     info() {

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

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

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

  21.     }

  22.     

  23. }

  24.  

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

  26. johnCar.startEngines();

  27. johnCar.info();

  28.  

  29.  

  30. /* output: 

  31. Mobil dinyalakan...

  32. Manufacture: Honda

  33. Color: Red

  34. Engines: Active

  35. */


Jika Anda terbiasa dengan bahasa pemrograman berbasis class, pasti penulisannya sangat serupa bukan?

Walaupun dari segi sintaksis pembuatan class antara keduanya cukup berbeda, namun perilaku dari objek yang dibuat dengan keduanya sama.

Inilah mengapa class pada ES6 hanya sebuah syntactic sugar dari konsep prototype yang sudah ada.
“Ketika kita hendak membuat sebuah constructor function ataupun class. Secara code convention (aturan penulisan), gunakan CamelCase dalam penamaannya. Contohnya Car daripada carSportCar daripada sportCar atau Sportcar

Contoh Penggunaan Default Parameters Di Javascript

Dengan menggunakan default parameters, nilai pada parameter tidak akan menghasilkan undefined walaupun kita tidak memberikan nilai ketika fungsi tersebut dipanggil. Default parameter dapat digunakan pada regular function ataupun arrow function.

Berikut contoh dari penggunaan default parameter:

  1. function sayHello(name = "Stranger", greet = "Hello") {

  2.     console.log(`${greet} ${name}!`);

  3. }

  4.  

  5. sayHello("Dimas", "Hai");

  6. sayHello();

  7.  

  8. /* output:

  9. Hai Dimas!

  10. Hello Stranger!

  11. */



  1. const sayHello = (name = "Stranger", greet = "Hello") => console.log(`${greet} ${name}!`);

  2.  

  3.  

  4. sayHello("Dimas", "Hai");

  5. sayHello();

  6.  

  7.  

  8. /* output:

  9. Hai Dimas!

  10. Hello Stranger!

  11. */



Pada contoh di atas, kita menggunakan tanda assignment (=) untuk menetapkan parameter name dengan nilai default “Stranger”, dan parameter greet dengan nilai default “Hello”. Hal ini sangat berguna ketika kita memanggil fungsi sayHello() tanpa menetapkan nilai parameter di dalamnya, karena walaupun kita tidak menetapkan nilainya, kedua parameter tersebut tidak akan menghasilkan undefined.

Belajar Babel Loader Javascript ES6

Apa itu  babel  atau  babel.js ? Babel merupakan sebuah transpiler yang bertugas untuk mengubah sintaks JavaScript modern (ES6+) menjadi sin...