Вызов базового конструктора-Javascript
существует 2 способа вызова родительского конструктора в дочернем.
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;