Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript inheritance with .call(this) [duplicate]

Code gotten from MDN:

function Employee() {
    this.name = "";
    this.dept = "general";
}

function Manager() {
    Employee.call(this);
    this.reports = [];
}

Manager.prototype = Object.create( Employee.prototype );

function WorkerBee() {
    Employee.call(this);
    this.projects = [];
}

WorkerBee.prototype = Object.create( Employee.prototype );

var x = new WorkerBee();

console.log( x );

Output: WorkerBee {name: "", dept: "general", projects: Array[0]}

What effect does Employee.call(this); have? I know from running the code that it is necessary for inheritance to be successful. The docs for .call() simply state,

method calls a function with a given this value and arguments provided individually.

OK so it calls the constructor Employee() but there is no new operator being used and no return that would return the object and it's properties. How does Employee.call(this) cause the child object to inherit the parent properties?

If this line is left out only the projects array is present as a property.

like image 648
Robert Rocha Avatar asked Sep 27 '22 12:09

Robert Rocha


2 Answers

What call does is simply invokes function with given context this. In your example it means that function Employee is called with this inside of it being instance of WorkerBee. So what happens in this case is that when Employee is executed it creates and sets own properties to the this object which at this moment WorkerBee.

Check what console logs when you run the code:

function Employee() {
    console.log(this instanceof WorkerBee);
    this.name = "";
    this.dept = "general";
}

... and you will see that this is indeed points to the object instance of WorkerBee.

This pattern is used to make one constructor create own properties on the external host object (context). It's also called "borrowing constructor".

like image 170
dfsq Avatar answered Oct 11 '22 16:10

dfsq


Employee.call(this); runs the function Employee with this within the function bound to the parameter. Somewhat confusingly, the parameter is this. When Employee.call(this); is run, this is a reference to the WorkerBee object that is being created with new.

With Employee.call(this);, the Employee function adds additional properties to the WorkerBee object.

like image 28
Cymen Avatar answered Oct 11 '22 15:10

Cymen