DEV Community

Sangeeth p
Sangeeth p

Posted on

Understanding Prototypical Inheritance in JavaScript: A Beginner's Guide

JavaScript is a powerful, dynamic language with an object-oriented programming (OOP) paradigm. Unlike many other OOP languages (such as Java or C++), JavaScript doesn't use classical inheritance. Instead, it employs prototypical inheritance, which is both flexible and unique.

In this blog, we'll dive deep into the concept of prototypical inheritance, explore how it works, and look at practical examples to better understand its power.

What Is Prototypical Inheritance?

Prototypical inheritance allows JavaScript objects to share properties and methods via a prototype chain. Every JavaScript object has an internal link to another object called its prototype. If a property or method is not found on the object itself, JavaScript looks for it in the prototype chain.

This mechanism allows objects to "inherit" behavior from other objects, making it a cornerstone of JavaScript's object-oriented features.

Key Terms

1.Prototype:
The object that another object inherits properties from.

2.proto:
The internal reference (or link) to the prototype of an object.

3.Object.prototype:
The top-level prototype from which all JavaScript objects indirectly inherit.

4.Prototype Chain:
The hierarchy of prototypes JavaScript traverses to find a property or method.

How Does Prototypical Inheritance Work?

Here's an example to illustrate prototypical inheritance in action:

// Define a base object
const animal = {
  eats: true,
  walk() {
    console.log("Animal walks");
  },
};

// Create a new object that inherits from 'animal'
const dog = Object.create(animal);
dog.barks = true;

console.log(dog.eats); // true (inherited from animal)
dog.walk(); // "Animal walks" (method inherited from animal)

console.log(dog.barks); // true (own property)

Enter fullscreen mode Exit fullscreen mode

Explanation

  1. The dog object inherits properties and methods from the animal object using the Object.create() method.
  2. When dog.eats is accessed, JavaScript first checks if the eats property exists directly on dog. If not, it looks for the property in the animal prototype.

Creating Prototypes

Using the Object.create() Method

Object.create() is the simplest way to set up prototypical inheritance.

const vehicle = {
  wheels: 4,
  drive() {
    console.log("Vehicle drives");
  },
};

const car = Object.create(vehicle);
console.log(car.wheels); // 4
car.drive(); // "Vehicle drives"

Enter fullscreen mode Exit fullscreen mode

Using Constructor Functions

Before ES6 classes were introduced, constructor functions were the primary way to create objects with inheritance.

function Person(name) {
  this.name = name;
}

Person.prototype.greet = function () {
  console.log(`Hello, my name is ${this.name}`);
};

const john = new Person("John");
john.greet(); // "Hello, my name is John"

Enter fullscreen mode Exit fullscreen mode

Here, the Person constructor sets up the prototype using Person.prototype. Objects created via new Person() inherit methods defined on Person.prototype.

Using ES6 Classes

With ES6, class syntax was introduced, making inheritance more intuitive while still leveraging the prototype chain under the hood.

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

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

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

const dog = new Dog("Buddy");
dog.speak(); // "Buddy barks"

Enter fullscreen mode Exit fullscreen mode

Even though this looks like classical inheritance, it is still based on JavaScript's prototypical inheritance.

Prototype Chain in Action

Let's visualize how the prototype chain works:

const parent = {
  greet() {
    console.log("Hello from parent");
  },
};

const child = Object.create(parent);

child.sayHi = function () {
  console.log("Hi from child");
};

child.greet(); // "Hello from parent"

Enter fullscreen mode Exit fullscreen mode

Prototype Chain:

  • child object: sayHi()
  • parent object (prototype): greet()
  • Object.prototype (base prototype): Methods like toString()

If a method or property is not found in any of these, JavaScript returns undefined.

Benefits of Prototypical Inheritance

1.Memory Efficiency:
Shared methods and properties are stored on the prototype, not duplicated across instances.

2.Dynamic Inheritance:
You can modify the prototype at runtime, and all inheriting objects will reflect the change.

3.Flexible Structure:
Objects can inherit from other objects directly without needing rigid class hierarchies.

Limitations

1.Prototype Chain Performance:
Long prototype chains can slow down property lookups.

2.Confusion for Beginners:
Understanding proto, prototype, and Object.create() can be overwhelming.

3.Lack of Private Fields:
Prior to ES6, private properties were difficult to implement using prototypes.

Conclusion

Prototypical inheritance is a cornerstone of JavaScript's OOP model, providing flexibility and dynamic behavior. Whether you're using Object.create(), constructor functions, or ES6 classes, understanding the prototype chain is key to writing effective and efficient JavaScript code.

With this knowledge, you can now explore advanced topics like mixins, prototype manipulation, and the difference between classical and prototypical inheritance.

Happy coding! 🚀

Tiugo image

Modular, Fast, and Built for Developers

CKEditor 5 gives you full control over your editing experience. A modular architecture means you get high performance, fewer re-renders and a setup that scales with your needs.

Start now

Top comments (0)

Neon image

Next.js applications: Set up a Neon project in seconds

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Get started →

đź‘‹ Kindness is contagious

Value this insightful article and join the thriving DEV Community. Developers of every skill level are encouraged to contribute and expand our collective knowledge.

A simple “thank you” can uplift someone’s spirits. Leave your appreciation in the comments!

On DEV, exchanging expertise lightens our path and reinforces our bonds. Enjoyed the read? A quick note of thanks to the author means a lot.

Okay