Skip to main content

Prototypes

In Javascript prototype is a mechanism that allows objects to inherit properties and methods from other objects.

In this article we will learn this foundamental concept, which is crucial to understand Javascript on a deep level.

Prototype Inheritance

Objects can have a prototype object, which acts as a template object that it inherits methods and properties from. An object's prototype object may also have a prototype object, which it inherits methods and properties from, and so on.

This is often referred to as a prototype chain, and explains why different objects have properties and methods defined on other objects available to them.

[[Prototype]] Property

Every object in JavaScript has a hidden [[Prototype]] property that links to another object (its prototype).

When you try to access a property on an object, JavaScript first looks for the property on the object itself. If it doesn't find it, it looks up the prototype chain.

function Person(name) {
this.name = name; // Instance property
}

// Adding a method to the Person prototype
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};

// Creating instances of Person
const person1 = new Person('Alice');
const person2 = new Person('Bob');

// Both instances can call the sayHello method
person1.sayHello(); // Output: Hello, my name is Alice
person2.sayHello(); // Output: Hello, my name is Bob

__proto__ keyword

The __proto__ keyword is a non-standard way to access the [[Prototype]] property of an object. It is not part of the ECMAScript standard, but most modern browsers support it.

const obj = {};
console.log(obj.__proto__ === Object.prototype); // Output: true

const arr = [];
console.log(arr.__proto__ === Array.prototype); // Output: true

const func = function() {};
console.log(func.__proto__ === Function.prototype); // Output: true

It is recommended to use the Object.getPrototypeOf() method to access the prototype of an object, as it is part of the ECMAScript standard.

const obj = {};
console.log(Object.getPrototypeOf(obj) === Object.prototype); // Output: true

Prototype Chain

JavaScript uses a mechanism known as the prototype chain. When accessing a property or method, if it is not found in the object itself, JavaScript will look up the prototype chain until it reaches Object.prototype, which is at the top of the hierarchy. If the property or method is still not found, it returns undefined

const obj1 = { a: 1 };
const obj2 = Object.create(obj1); // obj2's prototype is obj1

obj2.b = 2;

console.log(obj2.a); // Output: 1 (inherited from obj1)
console.log(obj2.b); // Output: 2 (own property)
console.log(obj2.c); // Output: undefined (not found in obj2 or obj1)

In this scenario, obj2 inherits from obj1, allowing it to access properties defined on obj1 through the prototype chain

ES6 and modern way of inheritance

Older versions of JavaScript doesn't have a traditional class-based inheritance model like many other languages. Instead, it relies on a more flexible and dynamic approach called prototypal inheritance.