Pengenalan Object-Oriented Programming (OOP)
Object Oriented Programming atau OOP adalah salah satu paradigma pemrograman yang sangat umum digunakan oleh developer di dunia. Paradigma OOP berdasarkan pada konsep objek yang memiliki atribut serta dapat melakukan operasi atau prosedur tertentu.
Meskipun JavaScript bukan bahasa pemrograman yang berbasis class seperti Java --Java sepenuhnya mengusung paradigma OOP--, tetapi JavaScript tetap bisa menerapkan dan memanfaatkan fitur OOP.
Pada modul ini kita akan membahas beberapa hal terkait OOP, seperti:
- Apa itu class?
- Empat pilar OOP.
- Penggunaan property & method.
- Object Composition.
- Contoh object/class bawaan dari JavaScript.
Mari kita lanjut ke materi selanjutnya!
Introduction to OOP
Object Oriented Programming (OOP) adalah salah satu paradigma dalam dunia pemrograman komputer. Ia adalah pendekatan berbasis objek, di mana suatu objek terdiri dari kumpulan atribut dan method di dalamnya. Di dalam JavaScript, atribut adalah variabel yang digunakan untuk menyimpan nilai. Sementara method adalah fungsi yang digunakan untuk menjalankan suatu proses.
Untuk lebih mudah memahami apa itu OOP, kita bisa menggunakan pemodelan hal-hal dunia nyata ke dalam program yang kita buat. Ambil contoh Kucing, ia berperan sebagai objek.
Kita ibaratkan ada seekor yang kucing memiliki karakteristik bulunya berwarna kuning, tinggi badan 23 cm, dan juga berat badan 4kg. Kucing tersebut juga memiliki kemampuan khusus yaitu mampu berlari, melompat, dan juga tidur.
Nah, dalam konteks OOP, karakteristik kucing (warna bulu, tinggi badan, dan berat badan) merupakan atribut dari suatu objek kucing, ia adalah nilai-nilai yang dimiliki oleh seekor kucing. Sedangkan kemampuan (berlari, melompat, tidur) adalah method dari seekor kucing, ia adalah suatu aktivitas yang bisa dilakukan oleh seekor kucing.
JavaScript memiliki kapabilitas untuk membuat program dengan menerapkan paradigma OOP. Meskipun ada beberapa perbedaan dan perdebatan mengenai OOP di JavaScript dengan yang ada di bahasa pemrograman lain.
Sebelumnya kita sudah mengenal dan mempelajari object yang dapat merepresentasikan sebuah layer data. Jika string dianalogikan sebagai kata (kumpulan karakter), number sebagai angka, dan boolean sebagai pernyataan benar atau salah; maka object dianalogikan sebagai sebuah benda yang lebih kompleks. OOP pun sama, tetapi lebih kompleks lagi karena di dalam paradigma OOP terdapat 4 pilar utama, yaitu encapsulation, abstraction, inheritance, dan polymorphism.
Sebagai contoh, kita memiliki sebuah data object bernama mail seperti contoh di bawah ini.
- const mail = {
- from: "pengirim@dicoding.com",
- sendMessage: function (msg, to) {
- console.log(`you send: ${msg} to ${to} from ${this.from}`);
- }
- };
- console.log(mail.from);
- mail.sendMessage('apakabar', 'penerima@dicoding.com');
- /**
- output:
- you send: apakabar to penerima@dicoding.com from pengirim@dicoding.com
- **/
Object di atas memiliki atribut dengan tipe data string (from) dan sebuah fungsi atau method untuk mengirim pesan (sendMessage). Selain itu kita juga dapat mengubah isi dari salah satu atribut dari objek tersebut. Contohnya:
- mail.from = "pengirim2@dicoding.com";
Atau, menambahkan sebuah fungsi baru bernama saveContact.
- mail.saveContact = function(addr) {
- console.log(`email saved ${addr}`);
- }
Contoh di atas adalah penulisan dengan gaya format object literal, yaitu penulisan object dengan langsung menuliskan key dan value-nya dalam Object yang dibuat. Hal-hal tersebut belum sepenuhnya merangkum konsep object dalam OOP.
Lalu, di benak Anda muncul beberapa pertanyaan sebagai berikut:
- Bagaimana jika saya ingin membuat objek baru bernama mail2 dengan atribut yang sama namun nilai yang berbeda dengan mail? Apakah harus mendefinisikan attribute dan function/method yang sama secara berulang?
- Bagaimana jika saya ingin membuat mail2 tanpa method saveContact?
- Bagaimana jika saya ingin menambahkan fungsi tambahan pada mail2?
Dari tiga pertanyaan di atas, maka fungsi paradigma OOP dapat menjadi solusi dikarenakan memiliki 4 pilar yang sudah disebutkan sebelumnya. Sederhananya kita akan membuat base template dari sebuah object, kemudian dari base tersebut kita dapat meng-instansiasi dalam bermacam bentuk objek. Di bawah ini adalah gambaran di mana Mail adalah base template dan sms, email, mailgroup adalah instansiasi dari Mail.
Contoh lainnya, misalkan base template dari sebuah object adalah Animal dan dapat merepresentasikan berbagai bentuk misalkan aves, mamalia, pisces, dll. Untuk membuat base template tersebut, maka kita akan mempelajari Class terlebih dahulu.
Class
Class adalah hal yang sangat penting dalam pemrograman berorientasi objek. Hal itu karena class menyediakan informasi tentang suatu object. Jadi dapat dikatakan object adalah instance dari sebuah class. Class sendiri dalam paradigma OOP secara teknis merupakan sebuah blueprint dalam mendefinisikan karakteristik dari sebuah objek. Sebagai contoh, misalkan terdapat blueprint untuk mendefinisikan objek Mail. Yang mana sms dan postman adalah object dari class Mail.
| Nama Class | |
| Karakteristik | pengirim, penerima, isi pesan |
| Kapabilitas/aksi | kirim pesan, terima pesan |
Di dalam sebuah class, dapat terdiri dari properti dan method. Properti merupakan karakteristik dari class, sedangkan method adalah kapabilitas atau kemampuan yang dimiliki oleh class.
Nah, untuk penulisan class di JavaScript sendiri bisa menggunakan dua cara, yakni melalui sintaks function ataupun class.
Mari kita lihat dulu cara membuat class menggunakan sintaksis function.
- function Mail() {
- this.from = 'pengirim@dicoding.com';
- };
- Mail.prototype.sendMessage = function n(msg, to) {
- console.log(`you send: ${msg} to ${to} from ${this.from}`);
- };
- // pemanggilan
- const mail1 = new Mail();
- mail1.sendMessage('hallo', 'penerima@dicoding.com');
- /**
- output:
- you send: hallo to penerima@dicoding.com from pengirim@dicoding.com
- **/
Perbedaan:
Cara pertama memiliki 2 pendekatan:
- Penulisan method menggunakan prototype
- Penulisan method sebagai sebuah properti secara umum
Cukup berbeda dengan bahasa pemrograman lain pada umumnya, JavaScript memiliki konsep bernama prototype. Prototype adalah properti internal yang akan selalu ada ketika sebuah objek dibuat. Dari kedua pendekatan tersebut, pemanggilan terhadap properti dapat dilakukan dengan cara yang sama. Namun, penerapan prototype lebih dianjurkan. Lihatlah sintaksis dibawah ini.
- // menggunakan prototype
- const mail = new Mail();
- mail.hasOwnProperty('sendMessage');
- // hasilnya = false
- --------
- // tanpa prototype
- const mail = new Mail();
- mail.hasOwnProperty('sendMessage');
- // hasilnya = true
Ketika kita meng-instantiate objek-objek lain, objek yang menggunakan prototype tidak meng-copy atribut sendMessage ke setiap objek-objek. Berbeda ketika kita tidak menggunakan prototype, semua attribute di-copy ke setiap objek. Dengan demikian, penggunaan prototype dapat menghemat alokasi memori yang digunakan.
Lanjut ke cara kedua, yakni menggunakan sintaksis class.
- // Cara 2
- class Mail {
- constructor() {
- this.from = 'pengirim@dicoding.com';
- }
- sendMessage(msg, to) {
- console.log(`you send: ${msg} to ${to} from ${this.from}`);
- };
- }
- const mail1 = new Mail();
- mail1.sendMessage('hallo', 'penerima@dicoding.com');
- /**
- output:
- you send: hallo to penerima@dicoding.com from pengirim@dicoding.com
- **/
Cara kedua pada dasarnya menggunakan prototype, penggunaan sintaksis class pada javascript hanyalah syntatic sugar dari prototype itu sendiri. Demikianlah cara umum yang digunakan untuk menuliskan dan menginstansiasi objek dari sebuah Class.
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:
- // cara 1
- class Mail {
- constructor() {
- this.from = 'pengirim@dicoding.com';
- this.contacts = [];
- this.yourOtherProperty = 'the values';
- }
- sendMessage(msg, to) {
- console.log(`you send: ${msg} to ${to} from ${this.from}`);
- this.contacts.push(to); // menyimpan kontak baru
- };
- }
- // cara 2
- function Mail() {
- this.from = 'pengirim@dicoding.com';
- this.contacts = [];
- this.yourOtherPrototype = 'the values';
- };
- Mail.prototype.sendMessage = function (msg, to) {
- console.log(`you send: ${msg} to ${to} from ${this.from}`);
- this.contacts.push(to); // menyimpan kontak baru
- };
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:
- const mail1 = new Mail();
- mail1.from; // 'pengirim@dicoding.com'
- mail1.contacts; // ['penerima@dicoding.com']
- mail1.sendMessage('hallo', 'penerima@dicoding.com'); // method mengirim pesan
Dari contoh tersebut, bagaimana jika kita ingin mengubah attribute contacts yang tidak dapat diakses langsung oleh objek yang telah meng-instansiasi. Kita perlu mengubah sedikit pada kode class Mail yang kita miliki:
- /**
- cara 1, menggunakan var (hanya dapat digunakan pada penulisan kelas menggunakan statement `function`)
- **/
- var contacts = [];
- // contoh
- function Mail() {
- this.from = 'pengirim@dicoding.com';
- var contacts = [];
- }
- /**
- cara 2, cara ini dapat digunakan pada penulisan kelas menggunakan statement `function` dan `class`
- **/
- this._contacts = []
- // contoh
- class Mail {
- constructor() {
- this._contacts = [];
- this.from = 'pengirim@dicoding.com';
- }
- }
- /**
- cara 3, menambahkan prefix # , cara ini dapat digunakan pada penulisan kelas menggunakan statement `class` saja
- **/
- #contacts = [];
- // contoh
- class Mail {
- #contacts = [];
- constructor() {
- this.from = 'pengirim@dicoding.com';
- }
- }
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.
- const mail = new Mail();
- 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.
- const mail1 = new Mail();
- mail1.sendMessage('hallo', 'penerima@dicoding.com');
- /**
- output-nya berhasil:
- you send: hallo to penerima@dicoding.com from pengirim@dicoding.com
- **/
Kita tidak dapat langsung mengakses sendMessage tanpa melakukan instansiasi terlebih dahulu, misalkan:
- Mail.sendMessage('hallo', 'penerima@dicoding.com');
- /**
- output-nya error:
- TypeError: Mail.sendMessage is not a function
- **/
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.namaMehod()).
Sebagai contoh, kita menambahkan sebuah method untuk memeriksa apakah sebuah input adalah nomor handphone:
- class Mail{
- static isValidPhone(phone) {
- return typeof phone === 'number';
- }
- }
Dari contoh di atas, kita dapat memanggil fungsi tersebut tanpa membuat instance kelas Mail terlebih dahulu.
- 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 di inisiasi. Maka dalam JavaScript ada dua cara, yaitu:
- // cara 1, jika kita menggunakan statement class
- class YourClassName{
- constructor(params1, params2, ....) {
- // do something here
- };
- }
- // cara 2, jika kita menggunakan statement function
- function Mail(params1, params2, ....) {
- this.yourPropertyName = params1;
- // do something here
- }
Contoh penerapannya sebagai berikut:
- // cara 1
- class Mail {
- constructor(author) {
- this.from = 'pengirim@dicoding.com';
- console.log('is instantiated', author);
- };
- }
- // cara 2
- function Mail(author) {
- this.from = author;
- console.log('is instantiated', author);
- }
Dari contoh constructor di atas, maka cara pemanggilannya menjadi seperti di bawah ini:
- 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:
- const mail1 = new Mail(085000111222); // misalkan untuk SMS
- const mail2 = new Mail("emailku@dicoding.com"); // misalkan untuk Email
4 Pilar OOP
Seperti yang sempat kita singgung pada awal modul OOP, terdapat empat pilar dalam OOP, yaitu encapsulation, abstraction, inheritance, dan polymorphism.
Encapsulation
Enkapsulasi adalah kondisi di mana attribute atau method di dalam class dibungkus dan bersifat privat. Artinya objek lain tidak bisa mengakses atau mengubah nilai dari property secara langsung. Pada contoh kasus Mail kita tidak bisa langsung mengubah daftar contact, namun kita bisa menambahkannya melalui fungsi saat kirim pesan atau mengambil data tersebut melalui method showAllContacts.
class Mail{
constructor(author) {
this._contacts = [];
this.from = author;
}
sendMessage = function(msg, to) {
console.log('you send:', msg, 'to', to, 'from', this.from);
this._contacts.push(to);
}
showAllContacts() {
return this._contacts;
}
}Abstraction
Abstraksi dapat dikatakan merupakan penerapan alami dari enkapsulasi. Abstraksi berarti sebuah objek hanya menunjukkan operasinya secara high-level. Misalnya kita cukup tahu bagaimana bagaimana pesan dikirim atau diterima, namun kita tidak perlu tahu seperti apa proses enkripsi dan dekripsi isi pesan, atau bagaimana sebuah daftar contact dapat bertambah.
Inheritance
Beberapa objek bisa memiliki beberapa karakteristik atau perilaku yang sama, tetapi mereka bukanlah objek yang sama. Di sinilah inheritance atau pewarisan berperan. SMS dan jenis pesan lainnya memiliki karakteristik umum yang dimiliki juga oleh jenis pesan lainnya, seperti memiliki konten pesan, alamat/nomor pengirim, alamat/nomor penerima, dsb. Maka dari itu, Email sebagai objek turunan (subclass) mewarisi semua sifat dan perilaku dari objek induknya (superclass) Mail. Begitu juga dengan objek Whatsapp juga mewarisi sifat dan perilaku yang sama. Namun, whatsapp bisa membuat grup, mengirim broadcast message sedangkan Email tidak.
Dari contoh di atas, misalkan kita ingin membuat 2 (dua) child class yaitu WhatsApp dan Email. Maka dalam JavaScript cara menuliskan pewarisan terdapat 2 cara, yaitu sebagai berikut:
// cara 1: menggunakan keyword `extends` jika menggunakan statement `class`
class ChildClassName extends ParentClassName{}
// cara 2: menggunakan `prototype` jika menggunakan statement `function` / `class`
ChildClassName.prototype = new ParentClassName()Misalkan kita akan membuat sebuah child class bernama WhatsApp yang mewarisi kelas Mail. Maka contoh kodenya adalah sebagai berikut:
Kita juga dapat mengakses attribute maupun method dari parent class yang Accessible. Misalkan:
wa1.sendMessage('halo', 089000999888);Polymorphism
Polymorphism dalam bahasa Yunani berarti “banyak bentuk”. Sederhananya objek dapat memiliki bentuk atau implementasi yang berbeda-beda pada satu metode yang sama. Semua jenis Mail dapat mengirim pesan, namun whatsapp, email, sms tentunya memiliki cara yang berbeda dalam mengirim pesan, misalkan: whatsapp dapat mengirim pesan suara sedangkan yang lainnya tidak, email dapat menyaring konten spam saat mengirim pesan sedangkan yang lain tidak. Perbedaan bentuk atau cara mengirim pesan tersebut merupakan contoh dari polymorphism.
Overriding Method
Overriding adalah teknik untuk kita melakukan perombakan (baik secara keseluruhan maupun tidak) pada sebuah method ataupun constructor yang dimiliki oleh parent class. Sehingga, ia dapat disesuaikan dengan behavior di child class.
Overriding Constructor
Sebelumnya kita telah mempelajari tentang constructor dan juga pewarisan. Pada contoh kasus di inheritance atau pewarisan, kita menemukan kasus seperti di bawah ini.
- class WhatsApp extends Mail{
- constructor() {
- super();
- this.username = 'dicoding';
- this.isBussinessAccount = true;
- }
- }
- //pemanggilan
- const wa1 = new WhatsApp(080111000222);
Sekarang bagaimana jika kita menambahkan username dan isBussinessAccount ke dalam constructor? Jika kita membuat constructor baru kodenya akan seperti ini:
- class WhatsApp extends Mail {
- constructor(username, isBussinessAccount, phone) {
- super();
- this.username = username;
- this.isBussinessAccount = isBussinessAccount;
- }
- }
- const wa1 = new WhatsApp('dicoding', true, 089989090898);
- /**
- Error:
- Must call super constructor in derived class before accessing 'this' or returning from derived constructor
- **/
Eror di atas terjadi karena constructor pada kelas parent gagal dieksekusi, meskipun kita telah menggunakan operator this.nameOfProperty. Solusinya kita dapat menggunakan operator super() untuk mengeksekusi method parent-nya. Sehingga, constructor pada kelas WhatsApp menjadi seperti ini.
- constructor(username, isBussinessAccount, phone) {
- super(phone);
- this.username = username;
- this.isBussinessAccount = true;
- }
Overriding Method
Hampir sama dengan overriding constructor, tetapi yang di-override di sini adalah method yang ada pada parent class. Pada dasarnya semua method yang ada pada kelas parent dapat diakses langsung di child kelasnya (as is).
- super.methodName();
Kadang kita tidak menggunakan sebuah method seutuhnya sama seperti parent kelasnya. Namun, kita dapat menambahkan perintah tertentu ataupun menguranginya. Berikut merupakan contoh override pada method sendMessage.
- class WhatsApp extends Mail {
- constructor(username, isBussinessAccount, phone) {
- super(phone);
- this.username = username;
- this.isBussinessAccount = isBussinessAccount;
- }
- // Overriding method => Melakukan Override Total
- sendMessage(msg, to) {
- console.log('Send by WA');
- }
- }
Ketika kita memanggil method sendMessage pada contoh di atas, ia hanya akan mengeksekusi kode yang ada pada child class.
- const wa1 = new WhatsApp('di', true, 089000999888);
- wa1.sendMessage('halo', 089000999888);
- /**
- Output:
- Send by WA
- **/
Untuk tetap melakukan eksekusi kode pada parent class maka perlu menggunakan operator super.methodName().
- sendMessage(msg, to) {
- super.sendMessage(msg, to);
- console.log('Send by WA');
- }
Catatan:
super(...) digunakan untuk memanggil constructor parent dan hanya dapat digunakan di constructor.
super.methodName(...) digunakan untuk memanggil parent method.
Object Composition
Setelah konsep dari OOP kita pelajari, pasti sudah ada gambaran terkait dengan bagaimana membuat sebuah Parent Class kemudian membuat berbagai Child Class yang mana mewarisi sifat-sifat dari parent-nya, serta dapat menambahkan, mengubah, bahkan merombak setiap method yang ada.
Sebuah paradigma OOP akan menghasilkan hierarki, di mana semakin besar software yang kita buat, maka akan semakin besar dan rumit juga hierarkinya.
Coba bayangkan saja jika kita ingin membuat Child Class bernama PersonalEnterpriseWhatsApp di mana blueprint kelas tersebut kita ingin menggunakan method dan attribute yang ada di PersonalWhatsApp dan BussinessWhatsApp. Kita perlu merombak kembali kelas-kelas parent-nya hanya untuk membuat sebuah kelas baru. Nah, di sinilah pendekatan object composition berperan.
Object composition adalah prinsip komposisi dari sebuah alur bisnis tanpa perlu melakukan pewarisan dari parent class. Prinsip ini didasarkan pada kumpulan perilaku (method/function) yang sudah kita definisikan. Sehingga, ketika ingin membuat alur bisnis lain dengan beberapa perilaku (method) yang sama, kita dapat menggunakan fungsi yang sudah ada tanpa melakukan inheritance/pewarisan.
Pada dasarnya konsep yang harus dilakukan adalah:
- Memisahkan fungsi-fungsi umum yang biasa digunakan.
- const yourGenericAction = params => ({
- actionA: () => { /** do action A **/},
- actionB: () => { /** do action B **/},
- });
- Membuat Class seperti biasa.
- const YourClassName = (paramA, paramB) => {
- }
- Kita dapat menyimpan atribut yang kita punya ke dalam sebuah object, biasanya seorang engineer menggunakan konstanta dengan nama self atau state untuk menampung attribute.
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramsA,
- paramsB
- };
- }
- Menambahkan perilaku (method/function) yang hanya ada pada kelas tersebut.
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramsA,
- paramsB
- };
- const yourSpecificActions = self => ({
- specificActinA: { /** do action A **/},
- });
- }
- Membuat kumpulan attribute, generic method, dan spesific method menjadi satu objek.
- const YourClassName = (paramA, paramB) => {
- const self = {
- paramsA,
- paramsB
- };
- const yourSpecificActions = self => ({
- specificActinA: { /** do action A **/},
- });
- return Object.assign(self, yourGenericAction(self), yourSpecificActions(self))
- }
Sebagai contoh, dari hirarki Mail yang sudah kita buat sebelumnya. kita akan merombak dan membuatnya dengan pendekatan Object composition.
Penjabaran kode di atas:
- Kita membuat sebuah abstraksi untuk method-method yang umum digunakan (di sini misalkan method mengirim pesan, dan validasi nomor hp).
- Kita membuat sebuah kelas baru dengan nama personalEnterprise, di mana seperti biasa kita dapat menggunakan parameter yang akan digunakan.
- Pada object composition ini, penggunaan parameter biasa digunakan untuk mendaftarkan attribute-attribute dari kelas tersebut. Pada contoh di atas, kita mengumpulkan attribute tersebut pada konstanta bernama self atau state.
- Method, kita dapat juga menambahkan method/fungsi yang spesifik hanya ada pada kelas tersebut (kapabilitasnya hanya pada kelas tersebut / tidak umum).
- Proses pembuatan object dengan perintah Object.assign(attribute, method1, method2, methodN).
Dari contoh kode di atas maka kita dapat membuat sebuah object dengan nama personalEnterprise tanpa harus melakukan pewarisan.
Built-in Class
Dalam JavaScript sendiri terdapat built-in class bawaan, misalnya Date, Object, Array, Math, dan String. Built-in class tersebut dapat digunakan untuk memanipulasi data-data terkait dengan array, perintah matematik, manipulasi karakter, dan manipulasi objek.
Date merupakan built-in object bawaan dari bahasa pemrograman JavaScript yang digunakan untuk utilitas terkait tanggal dan waktu. Ini sangat membantu ketika dalam program yang kita buat terdapat penggunaaan dan manipulasi tanggal dan waktu.
Untuk menggunakannya kita dapat meng-instansiasi Date object tersebut dengan 4 cara:
- // #1 tanpa parameter, yang berarti `myDate` akan berisi tanggal dan waktu saat ini
- const myDate = new Date();
- // #2 parameter tanggal dalam bentuk string, misal "January 01, 2021"
- const myDate = new Date(dateString);
- // #3 parameter dalam bentuk number, misal 87400000
- const myDate = new Date(miliseconds);
- // #4 parameter tanggal dalam bentuk number (7 parameter), [hour,minute,second,millisecond] bersifat opsional
- const myDate = new Date(year,month,date,hour,minute,second,millisecond);
Dalam object Date terdapat beberapa method yang dapat kita gunakan. Berikut adalah daftar method yang umum digunakan.
| Methods | Penjelasan | Contoh penggunaan |
|---|---|---|
| getMonth() | Nilai kembaliannya adalah bulan dalam bentuk angka (0 sampai 11), 0 berarti Januari. | myDate.getMonth() |
| getFullYear() | Nilai kembaliannya adalah tahun, misalkan 2021. | myDate.getFullYear() |
| getDate() | Nilai kembaliannya adalah tanggal dari 1 sampai 31. | myDate.getDate() |
| getHours() | Nilai kembaliannya adalah jam dari 0 sampai 23 | myDate.getHours() |
| getMinutes() | Nilai kembaliannya adalah menit dari 0 sampai 59 Nilai kembaliannya | myDate.getMinutes() |
| getSeconds() | Nilai kembaliannya adalah detik dari 0 sampai 59 | myDate.getSeconds() |
| getMilliseconds() | Nilai kembaliannya adalah mili-detik dari 0 to 999 | myDate.getMilliseconds() |
| getTime() | Nilai kembaliannya adalah waktu dalam bentuk epoch mili-detik (dimulai dari 1 January, 1970 yang berarti 0) | myDate.getTime() |
| getDay() | Nilai kembaliannya adalah hari dalam seminggu dari 0 sampai 6. 0 berarti minggu | myDate.getDay() |
Selain itu, juga terdapat static method yang dapat digunakan tanpa perlu melakukan instansiasi, yaitu:
| Method | Penjelasan | Contoh Penggunaan |
|---|---|---|
| parse(datestring) | digunakan untuk merubah tanggal dalam format string, menjadi epoch miliseconds | Date.parse("2021-01-01") |
| UTC(year, [..params]) | digunakan untuk merubah tanggal dalam format string, menjadi epoch miliseconds | Date.UTC(2021, 01, 01) |
Date String Format
ketika kita menggunakan tanggal dan waktu, kita perlu memahami format yang dipakai oleh standar dunia. Ini berguna dan memudahkan kita untuk melakukan konversi dan manipulasi sebuah tanggal. Format date string sendiri, secara umum terdiri dari:
| Format | Penjelasan |
|---|---|
| YYYY | 4 digit tahun, misalkan : 2021 |
| MM | 2 digit bulan, misalkan : 01 berarti Januari |
| DD | 2 digit tanggal 0 sampai 31 |
| HH | 2 digit jam 0 sampai 23 |
| mm | 2 digit menit 0 sampai 59 |
| ss | 2 detik detik 0 sampai 49 |
| sss | 3 digit milidetik 0 sampai 999 |
| - | Pemisah untuk tanggal |
| : | Pemisah untuk waktu |
| Z | Berarti tanggal akan diatur sebagai UTC |
Dari tabel format di atas, ketika misalnya kita akan melakukan parsing baik dari string ke milliseconds ataupun sebaliknya, kita dapat memanfaat format di atas.
Untuk Date Object javascript sendiri, nilai epoch dimulai dari 0 untuk tanggal 1 January, 1970, 00:00:00 UTC
Contoh Penggunaan Date
Berikut ini adalah kode misalkan kita ingin menghitung berapa umur kita dengan memanfaatkan object date.
Selain Date, kita juga dapat menggunakan built-in class javascript yang lainnya.
- const listOfContent = [1,2,”President”, {}];
- console.log(Array.isArray(listOfContent));
- // result is true
- const splitText = "12:20:00".split(':');
- // result is [ '12', '20', '00' ]
Rangkuman Materi
Kita telah berada di akhir dari modul Object Oriented Programming. Mari kita uraikan materi yang sudah Anda pelajari.
- OOP merupakan paradigma yang berdasarkan pada konsep objek yang memiliki atribut serta dapat melakukan operasi atau prosedur tertentu.
- Terdapat 4 (empat) pilar dalam object oriented programming, antara lain: encapsulation, abstraction, inheritance, dan polymorphism.
- Class merupakan blueprint untuk mendefinisikan karakteristik dari sebuah objek.
- Object composition memungkinkan penyusunan kumpulan perilaku/method untuk menghindari pewarisan dan hirarki yang kompleks.
Materi Pendukung
Berikut ini beberapa materi tambahan yang bisa Anda pelajari untuk mendalami seputar Object-Oriented Programming (OOP):




