Belajar JavaScript OOP: Pemrograman Berorientasi Objek

Oleh: Andi Ardiansyah Nasir Terakhir diperbarui: 10 Juni 2025

Pengantar OOP dalam JavaScript

Pemrograman Berorientasi Objek (OOP) adalah paradigma pemrograman yang menggunakan "objek" untuk mendesain aplikasi dan program. JavaScript, meskipun awalnya bukan bahasa OOP murni, telah mengadopsi banyak konsep OOP melalui fitur-fitur seperti class, inheritance, encapsulation, dan polymorphism.

Dalam artikel ini, kita akan menjelajahi berbagai aspek OOP di JavaScript modern, mulai dari class dasar hingga fitur-fitur canggih seperti private field dan static method. Dengan memahami OOP, Anda dapat menulis kode yang lebih terstruktur, mudah dipelihara, dan dapat digunakan kembali.

Class dalam JavaScript

Class adalah blueprint untuk membuat objek. Di JavaScript, class diperkenalkan di ES6 sebagai sintaks yang lebih jelas untuk membuat objek dan menangani inheritance.

Contoh Class Dasar

class Person {
  // Constructor, properties, dan methods akan ditambahkan di sini
}

Class sendiri tidak melakukan apa-apa sampai Anda membuat instance (objek) dari class tersebut:

const person1 = new Person();
console.log(person1); // Person {}

Constructor di Class

Constructor adalah method khusus yang dipanggil otomatis ketika instance class dibuat. Biasanya digunakan untuk inisialisasi properti.

Contoh Constructor

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

const person1 = new Person('Andi', 25);
console.log(person1); // Person { name: 'Andi', age: 25 }

Property di Class

Property adalah data yang dimiliki oleh instance class. Di JavaScript, property biasanya didefinisikan di constructor.

Contoh Property

class Car {
  constructor(brand, year) {
    this.brand = brand;  // Property
    this.year = year;    // Property
  }
}

const myCar = new Car('Toyota', 2020);
console.log(myCar.brand); // Toyota

Method di Class

Method adalah fungsi yang dimiliki oleh class dan dapat dipanggil pada instance class tersebut.

Contoh Method

class Person {
  constructor(name) {
    this.name = name;
  }

  // Method
  greet() {
    return `Halo, nama saya ${this.name}`;
  }
}

const person1 = new Person('Budi');
console.log(person1.greet()); // Halo, nama saya Budi

Class Inheritance

Inheritance memungkinkan class untuk mewarisi property dan method dari class lain menggunakan kata kunci extends.

Contoh Inheritance

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    return `${this.name} bersuara`;
  }
}

class Dog extends Animal {
  // Dog mewarisi dari Animal
}

const dog1 = new Dog('Rex');
console.log(dog1.speak()); // Rex bersuara

Super Constructor

super() digunakan untuk memanggil constructor dari parent class. Harus dipanggil sebelum menggunakan this.

Contoh Super Constructor

class Animal {
  constructor(name) {
    this.name = name;
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name); // Memanggil constructor Animal
    this.breed = breed;
  }
}

const dog1 = new Dog('Rex', 'Golden Retriever');
console.log(dog1); // Dog { name: 'Rex', breed: 'Golden Retriever' }

Super Method

super juga bisa digunakan untuk memanggil method dari parent class.

Contoh Super Method

class Animal {
  speak() {
    return 'Bunyi hewan';
  }
}

class Dog extends Animal {
  speak() {
    return super.speak() + ', Guk Guk!';
  }
}

const dog1 = new Dog();
console.log(dog1.speak()); // Bunyi hewan, Guk Guk!

Getter dan Setter di Class

Getter dan setter memungkinkan Anda mendefinisikan akses ke property dengan kontrol lebih.

Contoh Getter dan Setter

class Person {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  // Getter
  get fullName() {
    return `${this.firstName} ${this.lastName}`;
  }

  // Setter
  set fullName(name) {
    const [first, last] = name.split(' ');
    this.firstName = first;
    this.lastName = last;
  }
}

const person1 = new Person('Andi', 'Ardiansyah');
console.log(person1.fullName); // Andi Ardiansyah

person1.fullName = 'Budi Nugroho';
console.log(person1.firstName); // Budi

Public Class Field

Public class field memungkinkan mendeklarasikan property langsung dalam class tanpa constructor.

Contoh Public Class Field

class Counter {
  count = 0; // Public class field

  increment() {
    this.count++;
  }
}

const counter = new Counter();
counter.increment();
console.log(counter.count); // 1

Private Class Field

Private field (diawali dengan #) hanya bisa diakses dari dalam class itu sendiri.

Contoh Private Class Field

class Counter {
  #count = 0; // Private field

  increment() {
    this.#count++;
  }

  getCount() {
    return this.#count;
  }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // 1
console.log(counter.#count); // Error: Private field

Private Method

Seperti private field, private method juga hanya bisa diakses dari dalam class.

Contoh Private Method

class Auth {
  #checkPassword(password) { // Private method
    return password.length >= 8;
  }

  login(username, password) {
    if (this.#checkPassword(password)) {
      return `Welcome ${username}`;
    }
    return 'Password too short';
  }
}

const auth = new Auth();
console.log(auth.login('user1', '12345678')); // Welcome user1
console.log(auth.#checkPassword('123')); // Error: Private method

Operator instanceof

Operator instanceof memeriksa apakah suatu objek adalah instance dari class tertentu.

Contoh instanceof

class Animal {}
class Dog extends Animal {}

const dog = new Dog();

console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true

Static Field

Static field adalah property yang dimiliki oleh class itu sendiri, bukan instance-nya.

Contoh Static Field

class Config {
  static API_URL = 'https://api.example.com';
}

console.log(Config.API_URL); // https://api.example.com

const config = new Config();
console.log(config.API_URL); // undefined

Static Method

Static method adalah method yang dipanggil pada class itu sendiri, bukan pada instance.

Contoh Static Method

class MathUtils {
  static square(x) {
    return x * x;
  }
}

console.log(MathUtils.square(5)); // 25

const utils = new MathUtils();
console.log(utils.square(5)); // Error: utils.square is not a function

Error Handling dalam OOP

Kita bisa membuat custom error class dengan mewarisi dari class Error.

Contoh Custom Error

class ValidationError extends Error {
  constructor(message) {
    super(message);
    this.name = 'ValidationError';
  }
}

function validateInput(input) {
  if (!input) {
    throw new ValidationError('Input tidak boleh kosong');
  }
}

try {
  validateInput('');
} catch (err) {
  if (err instanceof ValidationError) {
    console.error(err.message); // Input tidak boleh kosong
  }
}

Kesimpulan

OOP dalam JavaScript modern menyediakan banyak fitur canggih untuk membangun aplikasi yang terstruktur. Dengan class, inheritance, encapsulation (melalui private field/method), dan static member, kita dapat mengorganisasi kode dengan lebih baik. Fitur-fitur seperti getter/setter memberikan kontrol lebih terhadap akses property, sementara custom error memungkinkan penanganan error yang lebih spesifik.

Memahami konsep-konsep OOP ini penting untuk pengembangan aplikasi JavaScript yang scalable dan maintainable. Meskipun JavaScript menggunakan prototypal inheritance di balik layar, sintaks class membuat OOP lebih mudah dipahami bagi developer yang berasal dari bahasa OOP tradisional.