Object-oriented programing (OOP) adalah paradigma pemrograman atau cara dalam menulis program yang berorientasi pada object. Paradigma ini menyusun program menjadi potongan-potongan kode cetak biru yang dapat digunakan kembali untuk membuat object individual dalam pemrograman.

Object adalah entitas unik yang biasanya memiliki 2 komponen, yaitu ciri-ciri dari object tersebut (properti) dan kemampuan yang dapat dilakukan oleh object tersebut (method).

Sebagai contoh, ada sebuah laptop di toko online. Laptop tersebut memiliki ciri-ciri dan kemampuan (perilaku) seperti berikut:

Ciri-ciri laptop:
  • name: Lenovo Thinkpad x230
  • price : 2300000
  • color: black
  • memory: 4 GB
Kemampuan (perilaku) laptop:
  • laptop dapat dinyalakan
  • laptop dapat memutar video

Jika data di atas kita terjemahkan menjadi object maka hasilnya seperti berikut:


Pada contoh di atas, laptop adalah nama dari objectnya, sedangkan name, price, color, dan memory adalah properti, start dan playVideo adalah method yang dimiliki object.

Function Constructor dan Class

Pada contoh sebelumnya, kita membuat sebuah object laptop di toko online. Bagaimana jika kita diminta untuk membuat 3 object laptop yang memiliki model atau bentuk yang sama, hanya berbeda value di setiap properti atau methodnya?

Method adalah istilah untuk properti object yang valuenya adalah sebuah function.

Solusi paling mudah tentu dengan membuat objectnya satu persatu seperti ini:

Sekilas tak ada masalah. Namun ini akan menjadi sebuah masalah jika yang diminta jumlahnya puluhan atau ratusan.

Solusinya adalah dengan membuat template atau blueprint dari object tersebut. 

Ada 2 cara di Javascript untuk membuat blueprint dari sebuah object, yaitu dengan menggunakan function constructor dan menggunakan class.

1. Function Constructor

Function constructor (constructor) adalah function yang digunakan untuk inisialisasi object baru (instance) dengan menggunakan keyword new.

Properti instance objectnya berada di dalam function constructor dan diawali oleh kata kunci this. Kata kunci this merujuk pada object pemiliknya.

Function constructor pada dasarnya adalah sebuah function declaration biasa. Untuk membedakannya, biasanya nama function constructor memakai huruf kapital pada permulaan katanya.

Dengan menggunakan contoh kasus sebelumnya, kita akan membuat 3 buah object menggunakan function constructor.

Sebuah object baru yang dibuat dari sebuah constructor disebut sebagai instance. Pada contoh di atas, laptop1, laptop2, dan laptop3 adalah instance dari Laptop.

2. Class

Javascript tidak memiliki konsep class karena bukan object-oriented programing tapi prototype-based language.

Namun, pada tahun 2015 atau versi ES6, Javascript memperkenalkan konsep class, yang mirip dengan class pada OOP language meskipun tidak benar-benar mirip.

Class adalah cetak biru (blueprint) dari sebuah object atau dalam bahasa sederhananya, class merupakan kelompok umum dari object. 

Class di Javascript sebenarnya adalah sebuah function namun dengan sintaks yang berbeda. Biasanya nama class ditulis menggunakan huruf kapital pada permulaan katanya.

Sintaks class pada JavaScript:

Dengan menggunakan contoh sebelumnya, kita akan membuat sebuah blueprint dari object laptop dan membuat 3 buah instance objectnya menggunakan class.

Contoh di atas memperlihatkan class Laptop dipakai untuk membuat tiga instance objectnya yaitu laptop1, laptop2, dan laptop3 menggunakan keyword new.

Dari kode di atas, ada beberapa komponen yang perlu diperhatikan ketika membuat class:
  • Constructor, yaitu method yang wajib ada pada class jika ingin menyimpan suatu properti. Ketika suatu object dibuat menggunakan class, maka constructor-nya juga ikut terpanggil. Parameter pada constructor berguna untuk memberikan data kepada properti.
  • Properti, yaitu data object yang akan disimpan. Properti berada di dalam constructor dan diawali oleh kata kunci this. Kata kunci this merujuk pada pada object pemiliknya.
  • Class method, merupakan method yang dapat dimiliki dari sebuah object. Biasanya dibuat di bawah constructor.

Method Getter dan Setter

Terdapat dua jenis properti object yaitu properti data dan properti aksesor. Properti data adalah properti yang biasa kita gunakan, yaitu properti yang mengandung key dan value, sedangkan properti aksesor adalah fungsi untuk mendapatkan dan mengatur sebuah nilai.

Properti aksesor diwakili dengan method getter dan setter. Method getter pada class digunakan untuk mengakses value dan method setter digunakan untuk mengubah value di dalam class.

Contoh:

Pada contoh di atas, class Mobil menyimpan properti _merekmobil dari instance objectnya yaitu object mobil. Tetapi kita mengakses nilai dari properti _merekmobil menggunakan method getMerek(), sehingga seolah-olah properti objectnya adalah getMerek().

Begitu saat kita menggunakan method setMerek(), sebenarnya kita sedang memanggil method tersebut. Javascript bisa mengetahui ini dari simbol = (sama dengan). Method setMerek() memberikan argument baru ke properti _merekmobil yaitu "Honda".

ES6 menyediakan sintaks khusus untuk mendefinisikan method getter dan setter yaitu dengan menggunakan kata kunci get dan set seperti berikut:

Access Modifier (Visibility)

Access modifier (visibility) adalah sebuah konsep yang digunakan untuk mengatur tingkat akses terhadap property atau method dalam sebuah object.

Fitur ini memiliki 3 tipe Access Modifier, yaitu private, public, dan protected. Namun pada pembahasan ini kita hanya akan membahas access modifier private dan public saja.

Private adalah ketika property atau methodnya hanya dapat diakses atau digunakan dalam fungsi tersebut. Dengan kata lain instance objectnya tidak dapat menggunakan property atau method tersebut.

Public adalah ketika property atau methodnya dapat di akses dari luar fungsi tersebut.

Contoh:

Pilar OOP Javascript

OOP memiliki 4 pilar utama yaitu:
  • Inheritance
  • Polymorphism
  • Encapsulation
  • Abstraction

Mari kita bahas satu — persatu.

1. Inheritance

Inheritance dalam OOP adalah proses menurunkan/mewariskan properti dan method sebuah class (parent class) ke class lain atau childnya (child class).

Untuk dapat menerima turunan dari parent class, child class harus menggunakan kata kunci extends dan diikuti oleh nama parent class-nya.

Sintaks:

Contoh:

Pada contoh di atas, class Person mewarisi semua properti dan method miliknya kepada class Student dengan menggunakan kata kunci extends. Oleh karena itu, class Student sekarang memiliki properti name dan method greet().

Kemudian, kita mengakses properti name dan method greet() dari class Student dengan membuat instance student1.

Contoh lainnya:

Method super()

Method super() digunakan di dalam child class untuk memanggil constructor pada parent class, sehingga kita dapat mengakses properti yang sama pada parent class.

Dengan method super() kita dapat menambahkan properti pada child class dan memberikan datanya secara langsung ketika instance (object) dari child class dibuat.


Pada contoh kode di atas, method super di dalam class Student mengacu pada class Person. Oleh karena itu, ketika constructor dari class Student dipanggil, ia memanggil constructor dari class Person yang memberikan properti name dan age kepadanya.

2. Polymorphism

Pada child class, selain mewarisi semua sifat dari parent-nya, child class juga bisa memiliki kemampuan yang berbeda dengan parent-nya.

Dengan kata lain, child class memiliki method yang sama dengan parent-nya namun dengan output yang berbeda (overriding), hal ini dikenal dengan sebutan polymorphism.

Polymorphism juga dikenal pada konsep OOP yang berarti kemampuan dari suatu object untuk memiliki banyak bentuk.

Contoh:

Dari kode di atas, di dalam class Kucing dibuat kembali method suara() yang sama dengan class Hewan tetapi isinya berbeda. Sehingga ketika method itu dipanggil, maka akan menghasilkan output miaaaw.

3. Encapsulation

Encapsulation (enkapsulasi) adalah cara untuk membatasi hak akses pada properti yang dimiliki oleh suatu object. Caranya dengan mengubah visibilitas properti dari public menjadi private. 

Tujuannya agar object lain tidak bisa mengubah value dari properti object yang sudah kita define dan hanya bisa diakses melalui method.

Selain defenisi diatas, enkapsulasi juga berarti membungkus properti dan method dalam satu unit/function.

Contoh: 

Kita punya sebuah class untuk menghitung ongkir sebuah barang. Total biaya ongkir di dapat dari hasil penjumlahan pajak yang nilainya constant yaitu 500 dan berat di kali 10000.

Kodenya seperti berikut:

Dilihat dari kode diatas tidak ada masalah. 

Namun bagaimana jika kita tidak sengaja mengganti value dari properti pajak dari luar. Seperti kode dibawah ini.

Dari hasil kode di atas, apa yang terjadi? Ya, nominal pajak berubah menjadi 2000, padahal seharusnya 500. Tentu saja,  ketidaksengajaan seperti di atas akan menjadi masalah. Oleh karena itu, kita perlu membatasi akses dari luar terhadap properti _pajak.

Caranya adalah dengan mengubah properti pajak dari public menjadi private (modifier private) menggunakan encapsulation.

Pada kode di atas, kita mengubah properti _pajak menjadi private (modifier private), sehingga hanya bisa diakses menggunakan method pajak. Properti tersebut kita beri tanda _ (underscore) untuk membedakan antara properti class Ongkir dan parameter constructor.

Untuk mengakses properti tersebut, kita membuat method getter dan setter pajak. Method getter digunakan untuk mengambil nilai dan method setter untuk mengubah nilai properti _pajak. Method getter dan setter dilambangkan dengan get dan set.

4. Abstraction

Abstraction adalah sebuah teknik untuk menyembunyikan detail tertentu dari sebuah object dan hanya menampilkan fungsionalitas atau fitur penting dari object tersebut.

Contoh penggunaan abstrac class:

Contoh di atas memperlihatkan bahwa detail properti job disembunyikan ke dalam class Job.

Hal ini dilakukan agar kode terlihat lebih rapih dan terstruktur karena properti pada job dipisahkan ke dalam sistem yang lebih kecil, yaitu class Job. 

Namun dari sisi pengguna, tidak dapat melihat properti apa saja yang terdapat pada class Job. 

Pengertian lain dari Abstraction

Abstraction dalam konteks yang berbeda memiliki arti lain yaitu tidak mendefinisikan isi dari suatu method. Ini berarti method tersebut masih bersifat abstrak (tidak jelas).

Contoh abstract method:

Dari contoh di atas, di dalam method total harga tidak ada sintaks bagaimana total biaya ongkir di kalkulasi (disembunyikan).

Yang dapat kita ketahui adalah bagaimana cara menampilkan total harganya, yaitu dengan memanggil function totalHarga.

SELESAI.

Referensi:
https://www.programiz.com/javascript/inheritance
https://skilvul.com/courses/javascript-intermediate/
https://medium.com/codeacademia/belajar-fundamental-opp-dengan-javascript-c1b721677ce9