JavaScript, meskipun sering dianggap sebagai bahasa berbasis prototipe, sepenuhnya mendukung paradigma Pemrograman Berorientasi Objek (OOP). Memahami OOP sangat penting untuk membangun aplikasi web yang kompleks, mudah dipelihara, dan skalabel. OOP berfokus pada konsep data dan fungsi yang dibungkus bersama dalam unit yang disebut 'objek'.
Sebelum ES6 (ECMAScript 2015), implementasi OOP di JavaScript sering kali terlihat sedikit rumit karena mengandalkan prototipe secara langsung. Namun, dengan diperkenalkannya sintaks class, JavaScript menjadi lebih intuitif bagi pengembang yang terbiasa dengan bahasa OOP tradisional seperti Java atau C++.
Keuntungan utama OOP meliputi:
Empat konsep fundamental membentuk tulang punggung OOP, dan keempatnya dapat diterapkan dalam JavaScript:
Enkapsulasi adalah teknik membungkus data (properti) dan metode (fungsi) yang beroperasi pada data tersebut menjadi satu unit (objek). Ini juga melindungi data dari akses atau modifikasi yang tidak diinginkan dari luar objek. Dalam JavaScript modern, kita menggunakan fitur Private Fields (ditandai dengan #) untuk mencapai enkapsulasi yang kuat.
Contoh sederhana:
class RekeningBank {
#saldo; // Properti private
constructor(initialSaldo) {
this.#saldo = initialSaldo;
}
deposit(jumlah) {
this.#saldo += jumlah;
}
getSaldo() {
return this.#saldo; // Hanya bisa diakses melalui metode getter
}
}
Abstraksi berarti menyembunyikan detail implementasi yang kompleks dan hanya menampilkan fungsionalitas yang diperlukan kepada pengguna. Pengguna objek hanya perlu tahu apa yang dilakukan suatu metode, bukan bagaimana cara kerjanya.
Ketika Anda memanggil rekening.deposit(100), Anda tidak perlu tahu bagaimana JavaScript mengelola alokasi memori untuk penambahan saldo tersebut; Anda hanya peduli bahwa saldo bertambah.
Pewarisan memungkinkan sebuah kelas (subclass/anak) mewarisi properti dan metode dari kelas lain (superclass/induk). Ini mendorong penggunaan kembali kode. Di JavaScript, ini diimplementasikan menggunakan kata kunci extends.
Misalnya, kelas MobilListrik dapat mewarisi semua properti dari kelas dasar Kendaraan, lalu menambahkan properti spesifik seperti kapasitasBaterai.
Polimorfisme (banyak bentuk) memungkinkan metode yang sama untuk berperilaku berbeda tergantung pada objek mana ia dipanggil. Dalam konteks JavaScript, ini sering terlihat melalui method overriding, di mana subclass mendefinisikan ulang metode yang sudah diwarisi dari superclass.
Jika kelas Hewan memiliki metode bersuara(), kelas turunannya (Anjing dan Kucing) dapat mengimplementasikan bersuara() dengan output yang berbeda (misalnya, "Guk Guk" atau "Meong").
Kata kunci class hanyalah "gula sintaksis" di atas model prototipe JavaScript. Namun, ia membuat deklarasi objek dan hubungan menjadi jauh lebih bersih. Semua objek dibuat dari cetak biru (blueprint) yang disebut Class, yang didefinisikan menggunakan kata kunci class dan diinisialisasi menggunakan new.
Perhatikan bahwa tanpa memahami prototipe di baliknya, Anda mungkin akan kesulitan mengatasi masalah pewarisan yang lebih mendalam, namun untuk pengembangan aplikasi sehari-hari, penguasaan sintaks class sudah sangat memadai untuk menerapkan prinsip OOP.
Menguasai OOP di JavaScript adalah langkah penting untuk naik level dari sekadar pengembang skrip menjadi arsitek perangkat lunak yang mampu merancang sistem yang kuat dan terstruktur. Mulailah dengan membuat kelas sederhana dan bereksperimen dengan pewarisan untuk melihat bagaimana konsep ini bekerja secara langsung dalam kode Anda.