//

JAVASCRIPT & CONSTRUCTOR

ECMAScript is a object based language. An object has a built-in property named constructor.

The constructor will reference the function which made the object.

function Foo();

var foo = new Foo();

foo.constructor === Foo; // true

How is constructor created?

When you created the foo object:


var foo = new Foo();

JavaScript engine creates a new functon object from your declaration. Togther with this, your prototype is created as well.

This default value the prototype is an object with property constructor, which is set to the function itself.

So, when new Foo is called, the Foo.prototype becomes __proto__ and the constructor becomes accessible from the object:


function Foo() { }

var foo = new Foo();

console.log(

  foo.hasOwnProperty('constructor'), // false
  Foo.constructor === Function, // true
  Foo.prototype.hasOwnProperty('constructor') // true

);

Prototype & the constructor

If we replace the prototype, we will end up losing the constructor:


function Foo() { }

var foo = new Foo();

foo.constructor === Object; // false
foo.constructor === Foo; // true

Foo.prototype = {};

foo = new Foo();

foo.constructor === Object; // true

What happens here is: when we created the foo object, the JavaScript engine creates an object and sets its constructor to Foo. But we overrode the prototype of the Foo with {}. This object ({}), does not have a constructor, so the compiler falls back to its __proto__, using the native Object.prototype.constructor.

Preserving constructor

Additional code is usually required to prevent it from being overwritten. If you intend to keep it correct, then put it into the new prototype, like this:

function Foo() { }

Foo.prototype = { };

var foo = new Foo();

foo.constructor === Foo; // false

Foo.prototype = { constructor: Foo };

foo = new Foo();

foo.constructor === Foo; // true