Prototype Chaining
The Prototype chaining is linking of object's prototypes in JavaScript, by implementing inheritance. Every object in javascript has internal link to another object of it’s own called prototype. This prototype is in turn linked to another prototype till the default prototype of Object is reached. The Object is linked to null as prototype suggesting end of prototype chain.
Reaching a property in object is done through the prototype. If a property is requested by an object and is not present in it’s class, the prototype chain is searched till the property is reached or null is reached. This is effective implementation of inheritance.
Consider an inheritance example below. Animal is a class with eat() and intelligence as method and property. Define the method using prototype. A child class called WildAnimal is created for this class which inherits all properties of Animal class and constructor set to WildAnimal class. Add live() function and name property in WildAnimal class.
Pictorial representation of prototype chaining of below example is as below. __proto__ refers to prototype of the object.

We create an instance of WildAnimal (Lion) and call eat() function defined in Animal, it searches in WildAnimal prototype for the method. If it is not found, it reaches Animal prototype and returns result.
Example of prototype chaining
Prototype of an object can be got using Object.getPrototypeOf(object) and can be set to other prototype using Object.setPrototype(object, newPrototype).
Example Object.getPrototypeOf and Object.setPrototype
document.write(Object.getPrototypeOf(WildAnimal) === Object);//returns false
Object.setPrototypeOf(WildAnimal, Object);
document.write(Object.getPrototypeOf(WildAnimal) === Object);//returns true
Inheritance
Constructor Inheritance
Every object in JavaScript has a prototype. It inherits all the properties of the parent class with constructor as a single own property. When we define a constructor MyConstructor():
function MyConstructor(){
//Code goes here.
}
JavaScript creates a constructor with following settings by default:
MyConstructor.prototype = Object.create(Parent.prototype, {
constructor: {
configurable: true,
enumerable: true,
value: MyConstructor,
writable : true
}
});
Hence any object is a sub-type of Object by default. But when we inherit a user-defined object from it’s parent, it’s prototype will be changed. Consider the code in above example:
The WildAnimal prototype is created from Animal prototype. Hence the constructor of WildAnimal is also overwritten with that of Animal.
When there are child classes whose constructor is different from parent class (because of passing of arguments or number of arguments passed) it will throw an error during object creation. To change the prototype chain, such that initialization in constructors are not hindered by inheritance, we restore the constructor property. Hence we add the line WildAnimal.prototype.constructor = WildAnimal; in code. Now, these steps are equivalent to:
WildAnimal.prototype = Object.create(Animal.prototype, {
constructor: {
configurable: true,
enumerable: true,
value: WildAnimal,
writable : true
}
});
Example of constructor inheritence in JavaScript
function WildAnimal(name){
//Call parent constructor, constructor stealing
Animal.call(this);
//Initialize this class properties
this.name = name;
}
//Create child class object that inherits properties from parent class.
WildAnimal.prototype = new Animal();
//Set constructor to refer to child class.
WildAnimal.prototype.constructor = WildAnimal;
Prototypal Inheritance
This method of inheritance does not involve strictly defined constructors. This was introduced by Douglas Crockford. In this inheritance, an object() function is created which creates an empty constructor and assigns the input object to it’s prototype. The constructor is returned as a new instance of the object. Basically, object() creates a constructor which returns new instance of any object passed to it, without the need for defining custom types. This way, the object is initially passed to object() which is the parent object or the base object. Resulting object can be modified or information fields can be added which is actually the child class.
In the example below, object() is the function which returns the new instance of constructor for any object passed to it.The school2 initially sends education as base class to it. When school and students are added from school2, it gets appended to already existing education class. When school3 is created and data gets added, it gets the prototype value of education and school2. This code created two classes similar to each other.
Example of prototypal inheritence
Combination Inheritance
It is also called a pseudoclassical inheritance. It uses prototype chaining to inherit properties and methods on the prototype, constructor stealing (calling parent class constructor in child class using call() or apply()) to inherit instance properties. It reuses the methods defined on the prototype and allows each instance to have it’s own properties. It is the most commonly used inheritance method in JavaScript. We can use instanceof() and isPrototypeOf() behavior to get it’s object type.
In the example below, Cabinet is the super-class with property budget and method getBudget. Transport class inherits Cabinet properties by call() function. It passes the budget property. The Transport prototype is assigned to Cabinet and method massTransport is defined. Hence when the instance of Transport is created it can access all the properties and methods of parent class and it’s own class also.
Example of combination inheritence
Comments
No comments have been made yet.
Please login to leave a comment. Login now