Вызов базового конструктора - Javascript

Существует два способа вызова родительского конструктора в дочерний элемент.

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;

Есть ли ситуации, когда кто-то был бы безопаснее/лучше, чем другой, или они всегда эквивалентны?

Ответ 1

Всегда лучше использовать базовый конструктор напрямую по следующим причинам:

  • Это быстрее. Интерпретатору не требуется доступ к prototype.constructor.
  • Это безопаснее. Рассмотрим следующую программу.

A наследуется от C, но я забыл установить A.prototype.constructor на A. Поэтому теперь он указывает на C. Это вызывает проблемы в конструкторе B, если мы используем второй метод:

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;