Skip to main content

Command Palette

Search for a command to run...

Problem with using ‘new’ for Inheritance

Published
1 min read
A

As a Senior Principal Engineer at CVSHealth, I specialize in building and optimizing cvs.com to deliver a superior guest experience. Using the latest web technologies, my team and I work diligently to create a user-friendly and intuitive platform that exceeds expectations.

Imagine you have the following block of code.

function Animal() {
     this.offspring = [];
}
function Dog() {
}
Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var d1 = new Dog();
var d2 = new Dog();
var pup = new Dog();
d1.offspring.push(pup);
d2.offspring; // Does 'd2.offspring' have a pup in it?

Well it turns out that d2, in the above case, does have a pup in it !!!

Why you ask ?

Because when you write ‘d1.offspring.push’, browser will do the following in its search for ‘offspring’ array.

Look up ‘offspring’ in d1 -> No match

Look up ‘offspring’ in Dog.prototype -> Match found

Hence, ‘pup’ is pushed into the offspring of ‘Dog.prototype’ and thus d2 has the same copy?

How do we fix this now?

Look up the code below where we use ‘Object.create’ with the combination of ‘Animal.call’.

function Animal() {
  this.offspring = [];
}
function Dog() {
  Animal.call(this); // Use Animal.call(this, args) if any arguments
  // exist. Else, use 'apply'
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
var d1 = new Dog();
var d2 = new Dog();
var pup = new Dog();
d1.offspring.push(pup); // Dog {offspring: Array[1]}
d2.offspring; // Dog {offspring: Array[0]}

There you go!

More from this blog

Adarsh Konchady's Blog

23 posts