0

Property & Method Property


Property adalah atribut dari sebuah objek, property sendiri dapat berupa tipe data primitive--seperti yang sebelumnya dibahas-- bahkan bisa juga berbentuk object dan fungsi. Misalkan isi pesan, list penerima, data pengirim, perintah kirim, dll. Sebagai contoh:

  1. // cara 1
  2. class Mail {
  3.     constructor() {
  4.         this.from = 'pengirim@dicoding.com';
  5.         this.contacts = [];
  6.         this.yourOtherProperty = 'the values';
  7.     }
  8.     sendMessage(msg, to) {
  9.         console.log(`you send: ${msg} to ${to} from ${this.from}`);
  10.         this.contacts.push(to); // menyimpan kontak baru
  11.     };
  12. }
  13.  
  14. // cara 2
  15. function Mail() {
  16.     this.from = 'pengirim@dicoding.com';
  17.     this.contacts = [];
  18.     this.yourOtherPrototype = 'the values';
  19. };
  20.  
  21. Mail.prototype.sendMessage = function (msg, to) {
  22.     console.log(`you send: ${msg} to  ${to} from ${this.from}`);
  23.     this.contacts.push(to); // menyimpan kontak baru
  24. };

Contoh class di atas memiliki 3 (tiga) property dan method. Yang perlu diingat, this merupakan representasi bahwasanya variable yang ditunjuk adalah atribute yang bersifat global dan menempel dengan objek tersebut. Sehingga, variabel dapat diakses dari method ataupun property di dalam kelas tersebut dengan menambahkan this di depannya. Sebagai gambaran, kita akan coba ubah kode di atas menjadi seperti berikut ini.

Contoh di atas menunjukan bahwa ketika kita ingin menginisialisasi ataupun mengakses sebuah attribute global dari sebuah kelas, maka harus menggunakan this.attributeName.

Dalam OOP sendiri, properti dibagi menjadi 2:

  • Internal interface : method dan property yang dapat diakses oleh method lain namun tidak bisa diambil/dijalankan di luar kelas tersebut.
  • External interface : method dan property yang dapat diakses di luar kelas itu sendiri.

Sedangkan di dalam JavaScript sendiri terdapat 2 jenis akses identifier untuk sebuah field:

  • Public : dapat diakses dari mana pun.
  • Private : hanya dapat diakses dari dalam kelas itu sendiri.

Secara default, semua atribut yang didefinisikan adalah public. Sehingga semua attribute tersebut dapat diakses oleh objek yang telah meng-instansiasi kelas tersebut. Sebagai contoh:

  1. const mail1 = new Mail();
  2. mail1.from; // 'pengirim@dicoding.com'
  3. mail1.sendMessage('hallo', 'penerima@dicoding.com'); // method mengirim pesan
  4. mail1.contacts; // ['penerima@dicoding.com']

Dari contoh tersebut, bagaimana jika kita ingin mengubah attribute contacts pada class Mail menjadi tidak bisa diakses di luar class atau oleh objek yang menjadi instansiasi class tersebut?

  1. /** 
  2. cara 1, menggunakan var (hanya dapat digunakan pada penulisan kelas menggunakan statement `function`)
  3. **/
  4. var contacts = [];
  5. // contoh
  6. function Mail() {
  7.     this.from = 'pengirim@dicoding.com';
  8.     var contacts = [];
  9. }
  10.  
  11. /**
  12. cara 2, cara ini dapat digunakan pada penulisan kelas menggunakan statement `function` dan `class`
  13. **/
  14. this._contacts = []
  15. // contoh
  16. class Mail {
  17.     constructor() {
  18. this._contacts = [];
  19.         this.from = 'pengirim@dicoding.com';
  20.     }
  21. }
  22.  
  23. /** 
  24. cara 3, menambahkan prefix # , cara ini dapat digunakan pada penulisan kelas menggunakan statement `class` saja 
  25.   **/
  26. #contacts = [];
  27. // contoh
  28. class Mail {
  29.     #contacts = [];
  30.     constructor() {
  31.         this.from = 'pengirim@dicoding.com';
  32.     }
  33. }

Dari contoh di atas, ketika kita ingin mengakses attribute contacts secara langsung melalui objek yang menginisiasi maka return-nya adalah undefined. Ketiga cara tersebut juga dapat digunakan pada sebuah method atau function.

  1. const mail = new Mail();
  2.  
  3. mail.contacts; // undefined

Catatan:
Ketahuilah bahwa cara ke-2 bukanlah cara murni yang diusung JavaScript dalam menetapkan atribut private. Namun, cara tersebut merupakan standarisasi penulisan yang biasanya digunakan oleh pengembang software (dengan JS) untuk membedakan variable-variable yang merupakan private variable.

Sedangkan untuk cara 3, belum sepenuhnya didukung oleh JavaScript engine versi lama. ini merupakan proposal pengembangan JavaScript terkait dengan identifier pada js (https://github.com/tc39/proposal-private-methods).


Class Method

Class Method adalah function atau method yang ada di dalam sebuah object. Untuk menggunakannya, sebuah class harus di-instantiate terlebih dahulu menjadi object baru bisa dijalankan. Contoh class mail di atas, kita akan menggunakan method sendMessage maka kita harus meng-instantiate Mail terlebih dahulu.

  1. const mail1 = new Mail();
  2. mail1.sendMessage('hallo', 'penerima@dicoding.com');
  3. /**
  4. output-nya berhasil:
  5. you send: hallo to penerima@dicoding.com from pengirim@dicoding.com
  6. **/

Kita tidak dapat langsung mengakses sendMessage tanpa melakukan instansiasi terlebih dahulu, misalkan:

  1. Mail.sendMessage('hallo', 'penerima@dicoding.com');
  2. /**
  3. output-nya error:
  4. TypeError: Mail.sendMessage is not a function
  5. **/


Static Method

Static method adalah function atau method yang sama seperti class method, akan tetapi untuk mengaksesnya tidak perlu meng-instantiate class. Kita cukup menuliskan nama kelas dan nama method-nya secara langsung (NamaClass.namaMethod()).

Sebagai contoh, kita menambahkan sebuah method untuk memeriksa apakah sebuah input adalah nomor handphone:

  1. class Mail{
  2.   static isValidPhone(phone) {
  3.     return typeof phone === 'number';
  4.   }
  5. }

Dari contoh di atas, kita dapat memanggil fungsi tersebut tanpa membuat instance kelas Mail terlebih dahulu.

  1. Mail.isValidPhone(089000000000) //true


Constructor

Ketika kita membuat sebuah objek, adakalanya karakteristik dari blueprint yang kita buat harus sudah didefinisikan bersamaan dengan sebuah objek saat pertama kali diinisiasi. Constructor adalah sebuah method/function yang dijalankan pertama kali ketika object dibuat. Dari contoh kelas yang kita buat sebelumnya, kita akan membuat from sebagai sebuah value yang harus ditulis ketika sebuah objek diinisiasi. Maka dalam JavaScript ada dua cara, yaitu:

  1. // cara 1, jika kita menggunakan statement class
  2. class Mail {
  3.   constructor(params1, params2, ....) {
  4. this.yourPropertyName = params1;
  5.     // do something here
  6.   };
  7. }
  8.  
  9. // cara 2, jika kita menggunakan statement function
  10. function Mail(params1, params2, ....) {
  11.     this.yourPropertyName = params1;
  12.   // do something here
  13. }

Contoh penerapannya sebagai berikut:

  1. // cara 1
  2. class Mail {
  3.     constructor(author) {
  4.         this.from = author;
  5.         console.log('is instantiated', author);
  6.     };
  7. }
  8.  
  9. // cara 2
  10. function Mail(author) {
  11.     this.from = author;
  12.     console.log('is instantiated', author);
  13. }

Dari contoh constructor di atas, maka cara pemanggilannya menjadi seperti di bawah ini:

  1. const mail1 = new Mail("emailku@dicoding.com");

Karena JavaScript bukan bahasa dengan dukungan static type maka sebenarnya kita dapat melakukan instansiasi dengan parameter sesuka kita:

  1. const mail1 = new Mail(085000111222); // misalkan untuk SMS
  2. const mail2 = new Mail("emailku@dicoding.com"); // misalkan untuk Email

Posting Komentar
Theme
Share
Additional JS