Skip to main content

Command Palette

Search for a command to run...

OOP in JavaScript?

Updated
2 min read

First Things First: What Is OOP, Really?

Forget "paradigm" and "abstraction layers." Let's keep it real, OOP is just grouping related stuff together like how life actually works.

Your coffee mug? It has properties (colour, size) and does things (holds coffee, gets warm). You don't store its colour in one drawer and its "hold-coffee" ability in another room. That'd be wild.

Code should feel the same.

The "Four Pillars" of OOP

Encapsulation = Keep Your Stuff in Your Lane

Your bank account balance isn't scribbled on a sticky note everyone can grab. You deposit or withdraw through the bank. this is how it looks in code -

class BankAccount {
  #balance = 0;  

  deposit(amount) {
    if (amount > 0) this.#balance += amount;
  }

  getBalance() {
    return this.#balance;
  }
}

Abstraction = Don't Sweat the Small Stuff

You drive a car. You press the gas pedal. You don't need to know about fuel injectors, piston timing, or transmission fluid. Thank goodness. Again lets see the code -

class PaymentProcessor {
  process(amount) {
    this.validate(amount);
    this.chargeCard(amount);
    this.sendReceipt();
  }


  validate(amount) { /* ... */ }
  chargeCard(amount) { /* ... */ }
}

// Using it:
processor.process(29.99);

You call process(29.99). Done. It just works.

Inheritance = Stand on Shoulders, Don't Reinvent

Your kid inherits your eye color and learns to ride a bike from you. They add their own flair.

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

  speak() {
    console.log(`${this.name} makes a sound`);
  }
}

class Dog extends Animal {
  speak() {
    console.log(`${this.name} barks!`);
  }
}

const buddy = new Dog("Buddy");
buddy.speak(); 

 // "Buddy barks!"

Polymorphism = Same Button, Different Magic

Press "play" on Netflix, show starts. Press "play" on Spotify, music flows. Same button. Smart behavior.

class Notification {
  send() {
    throw new Error("Subclasses must implement send()");
  }
}

class EmailNotification extends Notification {
  send() {
    console.log("Sending email...");
  }
}

class SMSNotification extends Notification {
  send() {
    console.log("Sending text...");
  }
}


function trigger(notification) {
  notification.send(); 
}

trigger(new EmailNotification()); 
trigger(new SMSNotification());

Add a new notification type tomorrow? Zero changes to trigger(). That's the flexibility it provides.

And the classic debate javascript isn’t really OOP, ahh . The truth is under the hood, prototypes are doing the heavy lifting. But since ES6, We get class syntax and it's quite readable.