Learning Hub MERN Stack Programming hub

Javascripts: Dive into the Deep End of Object-Oriented Programming with Examples


I. Introduction

Listen up, code wranglers! We’re about to dive deep into the ocean of Object-Oriented Programming (OOP) in Javascript. It’s high time we got our hands dirty with the nitty-gritty of this powerful programming paradigm. So, let’s take the bull by the horns and start exploring the world of Javascript objects.

A. What’s OOP All About?

Object-Oriented Programming, or OOP, is a programming paradigm that uses objects – data structures consisting of data fields and methods together with their interactions – to design applications and computer programs. OOP revolves around four main principles: Encapsulation, Inheritance, Polymorphism, and Abstraction. We’ll go over these in detail as we explore the OOP-sea in Javascript.

II. Javascript and OOP

A. Understanding Objects in Javascript

In Javascript, almost everything is an object. But what does that mean? Let’s break it down and create our first object.

B. Building Blocks: Constructors and Prototypes

The constructor and prototype are the building blocks of OOP in Javascript. They might seem tricky at first, but with some hands-on examples, they’ll be as clear as a bell.

C. Property Descriptors and Accessor Properties

Javascript objects have some hidden features up their sleeve. Let’s unveil them and understand how to use Property Descriptors and Accessor Properties.

III. Deep Dive into OOP Principles

A. Encapsulation

Binding Together Data and Methods in Javascript

Encapsulation, often referred to as packing a punch, is about bundling data and methods into one neat, compact package. In programming terms, this package is usually a class or an object. With this final principle in our exploration of Object-Oriented Programming with Javascript, let’s unbox encapsulation and see how Javascript wraps it up.

A. Understanding Encapsulation

In a nutshell, encapsulation is the practice of keeping fields (properties) within a class private, and providing access to them through public methods (getters and setters). This ensures that the internal state of an object cannot be changed randomly, but only through a well-defined interface. By encapsulating your data, you’re essentially protecting it – like a pearl in an oyster.

B. The Power of Encapsulation in Javascript

Javascript provides a number of ways to implement encapsulation. Before ES6, you could use constructor functions and closures to encapsulate private data. With ES6, classes and Symbols allow for a more intuitive implementation.

Let’s consider an example with a BankAccount class:

class BankAccount {
  #balance; // Private field

  constructor(initialBalance) {
    this.#balance = initialBalance;

  // Public methods
  deposit(amount) {
    this.#balance += amount;

  withdraw(amount) {
    if (amount > this.#balance) {
      console.log('Insufficient balance');
    this.#balance -= amount;

  checkBalance() {
    return this.#balance;

let myAccount = new BankAccount(1000);
console.log(myAccount.checkBalance()); // Outputs: 1500
myAccount.withdraw(2000); // Outputs: Insufficient balance

In this example, the BankAccount class encapsulates the balance field and provides public methods to interact with it. This ensures that the balance field is protected from external interference.

In other words, we can’t directly modify balance – we have to go through the proper channels (the deposit and withdraw methods). And if we try to withdraw more than we have, the withdraw method gives us a stern warning. This is encapsulation in action.

C. Wrapping It Up

Encapsulation, by providing a protective layer around data, adds robustness to our code. It allows us to maintain control over our data and shields it from unwanted changes. It’s like having a secret recipe – the users can enjoy the dish, but the details of the recipe are securely hidden away.

Now that you’re familiar with the core principles of Object-Oriented Programming and how they’re implemented in Javascript, it’s time to put this knowledge into practice. Remember, learning to code is like learning to cook – it requires patience, practice, and a whole lot of trial and error. So, roll up your sleeves, fire up your code editor, and start cooking up some Javascript magic. Happy coding!

B. Inheritance

Javascript’s Family Tree

Inheritance, as the name suggests, is all about handing down properties and characteristics. Just like in a family tree, where traits are passed down from parents to children, Javascript objects also have their own lineage! Let’s dive deeper into how inheritance plays out in the world of Javascript.

A. Understanding Inheritance

Inheritance in Object-Oriented Programming is a way for one class to extend another class, thereby inheriting its fields and methods. This means that an object of the child class (also known as a subclass) can access the properties and methods of the parent class (also known as a superclass), in addition to any new properties and methods defined in the subclass itself. This mechanism promotes code reusability and a logical structure.

B. Javascript’s Spin on Inheritance

Traditionally, Javascript used prototype-based inheritance. But with the introduction of ES6, classes became a part of the language, providing a more straightforward way to implement inheritance.

Consider the following example:

class Vehicle {
  constructor(make, model, year) {
    this.make = make;
    this.model = model;
    this.year = year;

  displayVehicle() {
    return this.make + ' ' + this.model + ', ' + this.year;

class Car extends Vehicle {
  constructor(make, model, year, doors) {
    super(make, model, year);
    this.doors = doors;

  displayCar() {
    return super.displayVehicle() + ', ' + this.doors + ' doors';

let myCar = new Car('Toyota', 'Corolla', 2005, 4);
console.log(myCar.displayCar()); // Outputs: Toyota Corolla, 2005, 4 doors

In this example, the Car class extends the Vehicle class using the extends keyword, thereby inheriting the properties and methods of the Vehicle class. The super keyword is used to call the constructor of the Vehicle class.

This is inheritance at its finest – allowing you to create a new class (Car), based on an existing class (Vehicle), but with more specific features (the number of doors). It’s as if Car is saying to Vehicle, “Anything you can do, I can do – plus a little more!”

C. Polymorphism

Polymorphism in the World of Javascript

Polymorphism, a term borrowed from the biological sciences, means the ability to take on many forms. It’s one of the four main principles in the world of OOP, and Javascript, being the versatile language that it is, certainly doesn’t miss out on supporting this principle. In fact, it has a pretty nifty way of going about it.

A. Understanding Polymorphism

In simple terms, polymorphism in programming allows objects to be represented in multiple forms. This means that a single function or method can be used in several different ways depending on the context. If this sounds a bit abstract, don’t worry. Once we go through some examples, it’ll be as clear as a bell.

B. How Does Javascript Support Polymorphism?

Javascript is a dynamically-typed language, which means that the same variable can be used to hold different data types. This makes it inherently polymorphic. But beyond that, Javascript supports polymorphism in OOP through its prototype-based inheritance system and class structures.

When you create a method in a parent class (also known as a superclass), that method can be used by all objects of that class and its child classes (also known as subclasses). This is where polymorphism comes into play. The same method name can be used to perform different actions depending on the object using it.

Let’s illustrate this concept with an example:

class Shape {
  area() {
    return 0;

class Circle extends Shape {
  constructor(radius) {
    this.radius = radius;

  // Override area method
  area() {
    return Math.PI * this.radius ** 2;

class Rectangle extends Shape {
  constructor(width, height) {
    this.width = width;
    this.height = height;

  // Override area method
  area() {
    return this.width * this.height;

// Creating new objects
let myCircle = new Circle(5);
let myRectangle = new Rectangle(4, 7);

// Using the same method on different objects
console.log(myCircle.area()); // Outputs: 78.53981633974483
console.log(myRectangle.area()); // Outputs: 28

In this example, the area method is defined in the Shape superclass and then overridden in the Circle and Rectangle subclasses. Each subclass uses the same area method, but it behaves differently depending on the object that calls it. This is the essence of polymorphism.

So, Javascript not only supports polymorphism but also provides a flexible and intuitive way to implement it. Now that you’ve seen polymorphism in action, feel free to play around with it and use it in your own Javascript adventures.

D. Abstraction

Simplifying Complexity in Javascript

Abstraction, in essence, is all about the art of simplification. It’s like a magician’s trick – you show only what’s necessary, while the complexities are cleverly concealed behind the curtain. This principle holds a significant place in the realm of Object-Oriented Programming. So, let’s see how Javascript, our star of the show, handles this concept.

A. Understanding Abstraction

In the context of OOP, abstraction is the process of hiding the internal details and showcasing only the functionality to the users. If you’re wondering why this is important, consider a car. When you drive a car, you don’t need to know the intricate details of how its engine works. All you need to know is how to operate the steering wheel, brakes, and accelerator. The complexity of the engine’s workings is abstracted away from you. This makes the car easier to use and reduces the potential for errors.

Similarly, in programming, abstraction allows us to hide the complex details and provide a simple interface. This not only makes the code easier to understand and use, but it also helps to reduce the impact of changes. When the internal details are changed, the parts of the code that use the abstracted code won’t be affected as long as the interface stays the same.

B. Abstraction in Javascript

In Javascript, abstraction can be achieved in several ways. One common method is through the use of classes and objects. When you define a class, you define the methods (functions) and properties (variables) that the objects of the class will have. But the internal workings of the methods – the code inside them – is hidden from the code that uses the objects. All that code needs to know is what methods to call and what properties it can access. The details of how those methods work is abstracted away inside the class.

Here’s an example of abstraction in Javascript:

class Bank {
  constructor() {
    this._balance = 0; // Private variable

  // Public methods
  deposit(amount) {
    if (amount < 0)
      throw new Error('Deposit amount can\'t be negative.');

    this._balance += amount;

  withdraw(amount) {
    if (amount > this._balance)
      throw new Error('Not enough balance.');

    this._balance -= amount;

  get balance() {
    return this._balance;

let myBank = new Bank();
console.log(myBank.balance); // Outputs: 100
console.log(myBank.balance); // Outputs: 50

IV. Prototypal Inheritance in Javascript

The prototype is a Javascript object’s best friend. It’s what helps Javascript objects get their OOP on. We’ll delve deeper into Prototypal Inheritance and understand how prototypes can be both powerful and a tad tricky to understand.

A. Understanding Prototypes

Javascript’s prototype system can seem like a maze, but don’t worry, we’ll navigate it together!

B. Prototype Chains and Inheritance

Once you’ve got the hang of prototypes, it’s time to climb up the prototype chain. We’ll understand how inheritance works through prototypes in Javascript.

V. Classes in Javascript

ES6 brought along a new way of dealing with OOP – Classes. Let’s decode what they are and how they help with OOP.

A. Creating and Using Classes

Learn how to create classes in Javascript, add methods, and instantiate objects.

B. Inheritance in Classes

How does inheritance work with classes? We’ll answer that question with some hands-on examples.

VI. The “This” Keyword

The this keyword is a vital piece of the OOP puzzle in Javascript. We’ll understand its importance and learn how to use it effectively.

VII. Practical Application: Building Projects

Alright, enough theory. Let’s put all that we’ve learned to the test. We’ll build some projects using OOP in Javascript, which will help you solidify these concepts.

A. Mini-Project: A Simple Library System

First off, we’ll start with a simple library system. This mini-project will help you understand how to create classes, add methods, and use inheritance.

B. Larger Project: A Simple E-commerce System

Moving on, we’ll build a simple e-commerce system. This will be a bit more complex and will help you grasp the true power of OOP in Javascript.

VIII. Conclusion

Object-Oriented Programming in Javascript is like learning to juggle – at first, you may drop the ball a few times, but with practice, you’ll get the hang of it! Learning OOP will not only help you write more efficient and clean code, but also prepare you to tackle larger, more complex projects in the future.

IX. Bonus: Best Practices and Tips

Before we wrap up, let’s go through some best practices and tips to keep in mind while using OOP in Javascript.

A. Use “Strict” Mode

Javascript’s “strict” mode catches some common coding bloopers and throws exceptions. This helps you to avoid some pitfalls in your coding journey.

B. Leverage ES6 Features

ES6 brought along some useful features that make dealing with OOP a breeze. Make sure to make the most of them.

C. Understand Scope

Scope is an essential concept in Javascript and OOP. A solid understanding of scope will help you avoid common bugs in your code.

D. Write Clean Code

Coding is an art, and clean code is the key to a masterpiece. Break down your code into functions and classes, name your variables and functions sensibly, and always comment your code.

E. Test Your Code

Writing tests for your code is as essential as writing the code itself. This helps you catch bugs early and ensures your code is working as expected.

X. Conclusion: Wrapping it Up

And with that, we’ve come to the end of our Javascript OOP journey! Remember, practice is key when it comes to programming, so make sure to code every day and apply these principles in your projects.

Learning OOP in Javascript might seem like climbing a mountain at first, but remember, every journey starts with a single step. The view from the top is worth it! Keep on learning, exploring, and coding. Happy Javascripting!

To conclude, understanding and applying OOP in Javascript is a feather in your cap as a developer. It might seem like a lot at first, but with the right mindset and regular practice, you’ll be speaking the language of objects before you know it! So, don’t get your code in a twist, and remember – it’s all about objects!



About Author


  1. Avatar


    May 22, 2023

    very helpfull
    thanks for the article
    improve the theme

  2. Avatar


    May 22, 2023

    Great Article ..filled with knowledgable things.. Thank you for the article

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

AskIndia.com is your gateway to the latest developments in technology and innovation across India. Stay informed with insightful articles, comprehensive analyses, and join a community passionate about the tech landscape.

Our Company

Stay Informed with the Latest Insights on Tech and Innovation in India

    Our dedication to unraveling technology and innovation narratives sets Ask India apart as a premier information hub in India.

    AskIndia.com @2023. All Rights Reserved.