Ilia Choly
Ilia Choly

Reputation: 18557

Calling base constructor - Javascript

There are 2 ways to call the parent constructor in the child.

var A = function A() {
  this.x = 123;
};

var B = function B() {

  // 1. call directly
  A.call(this);

  // 2. call from prototype
  A.prototype.constructor.call(this);
};

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

Are there any situations when one would be safer/better than the other, or are they always equivalent?

Upvotes: 11

Views: 6518

Answers (1)

Aadit M Shah
Aadit M Shah

Reputation: 74204

It's always better to use the base constructor directly for the following reasons:

  1. It's faster. The interpreter doesn't need to access prototype.constructor.
  2. It's safer. Consider the program below.

A inherits from C, but I forgot to set A.prototype.constructor back to A. So it now points to C. This causes problems in the constructor B if we use the second method:

var C = function C() {
    // some code
};

var A = function A() {
  this.x = 123;
};

A.prototype = Object.create(C.prototype);
// I forgot to uncomment the next line:
// A.prototype.constructor = A;

var B = function B() {

  // 1. call directly
  A.call(this);

  // 2. call from prototype
  A.prototype.constructor.call(this); // A.prototype.constructor is C, not A
};

B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

Upvotes: 18

Related Questions