DEV Community

Abhay Yt
Abhay Yt

Posted on

The Prototype Chain in JavaScript: Understanding Inheritance and Object Lookup

The Prototype Chain in JavaScript

The prototype chain is a fundamental concept in JavaScript's inheritance model. It allows objects to inherit properties and methods from other objects, and it's the key mechanism behind how inheritance works in JavaScript.

How the Prototype Chain Works

When you create an object in JavaScript, it is linked to another object that acts as its prototype. Every object has a hidden internal property, [[Prototype]], which references the prototype object.

When you access a property or method on an object, JavaScript first checks if the property exists on that object. If not, JavaScript will look up the chain to the object's prototype, then to the prototype of that prototype, and so on, until it reaches Object.prototype (the root of the prototype chain). If the property or method is not found at any level of the chain, JavaScript will return undefined.

Example of Prototype Chain

// Constructor function for Animal
function Animal(name) {
    this.name = name;
}

// Adding a method to Animal's prototype
Animal.prototype.speak = function() {
    console.log(this.name + " makes a noise.");
};

// Constructor function for Dog
function Dog(name) {
    Animal.call(this, name); // Inherit properties from Animal
}

// Set up the prototype chain so Dog inherits from Animal
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // Reset the constructor reference

// Create an instance of Dog
const dog = new Dog("Buddy");
dog.speak();  // Output: "Buddy makes a noise."
Enter fullscreen mode Exit fullscreen mode

In this example:

  • The Dog object inherits from the Animal prototype via the prototype chain.
  • When you call dog.speak(), JavaScript first looks for the speak method on the dog object. If it's not found there, it checks Dog.prototype, and finally Animal.prototype.
  • Since speak exists in Animal.prototype, it is found and executed.

The Prototype Chain and Object.prototype

Every object in JavaScript ultimately inherits from Object.prototype, which is the topmost prototype object in the prototype chain. This means that all objects, including instances of built-in objects like arrays, functions, and user-defined objects, will have access to the methods and properties defined on Object.prototype.

const obj = {};
console.log(obj.toString()); // Output: "[object Object]"
// The toString method is inherited from Object.prototype
Enter fullscreen mode Exit fullscreen mode

Prototype Chain Lookup Process

  1. First, JavaScript looks for the property or method on the object itself.
  2. Next, if the property isn't found, JavaScript looks at the object's prototype.
  3. Then, it checks the prototype's prototype, and continues up the chain until it reaches Object.prototype.
  4. If the property isn't found even in Object.prototype, undefined is returned.

Visualizing the Prototype Chain

Consider the following example:

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

Person.prototype.sayHello = function() {
    console.log("Hello, " + this.name);
};

const john = new Person("John");

console.log(john.sayHello());  // Output: "Hello, John"
console.log(john.toString());  // Output: "[object Object]"
Enter fullscreen mode Exit fullscreen mode

In this case, the prototype chain for john looks like this:

john --> Person.prototype --> Object.prototype --> null
Enter fullscreen mode Exit fullscreen mode
  • john does not have the toString method directly, so JavaScript looks at Person.prototype, and if it's not found there, it checks Object.prototype.
  • Finally, if it's not found in Object.prototype, it returns undefined.

Conclusion

The prototype chain in JavaScript enables powerful inheritance capabilities, allowing objects to inherit properties and methods from other objects. Understanding how the prototype chain works is crucial for mastering JavaScript and creating more efficient, object-oriented code.

Hi, I'm Abhay Singh Kathayat!
I am a full-stack developer with expertise in both front-end and back-end technologies. I work with a variety of programming languages and frameworks to build efficient, scalable, and user-friendly applications.
Feel free to reach out to me at my business email: kaashshorts28@gmail.com.

Top comments (0)