Переопределение методов

Если имя метода в производном классе совпадает с именем метода из базового класса, то будет использоваться метод из производного класса. Чтобы вызвать метод базового класса из метода производного класса, следует воспользоваться методами call() или apply() (см. разд. 10.5). Пользоваться методом apply() более универсально, так как можно передать объект arguments. Рассмотрим переопределение методов на примере (листинг 11.4).

Листинг 11.4. Переопределение методов

function A(_a) {
   this.a = _a;
}
A.prototype.print = function() {
   console.log(`A.a = ${this.a}`);
};
function B(_a, _b) {
   A.call(this, _a);     // Вызываем конструктор класса A
   this.b = _b;
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;
B.prototype.print = function() {
   // Вызываем метод базового класса (если нужно, конечно)
   // A.prototype.print.apply(this, arguments);
   console.log(`B.b = ${this.b}`);
};
let objB = new B(10, 55);
objB.print(); // B.b = 55
let objA = new A(12);
objA.print(); // A.a = 12

Любой созданный объект автоматически наследует свойства класса Object. Например, при попытке вывести значение экземпляра в диалоговом окне вызывается метод toString(), который должен возвращать значение в виде строки. Для примера выведем текущее значение:

let objB = new B(10, 55);
console.log(objB + '');

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

[object Object]

С помощью прототипов можно переопределить этот метод таким образом, чтобы выводилось нужное нам значение:

B.prototype.toString = function() {
   return `{ a: ${this.a}, b: ${this.b} }`;
}
let objB = new B(10, 55);
console.log(objB + '');

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

{ a: 10, b: 55 }

При попытке выполнить арифметическую операцию вызывается метод valueOf(), который должен возвращать значение в виде числа (или другого типа). Для примера переопределим метод таким образом, чтобы он возвращал значение свойства b:

B.prototype.valueOf = function() {
   return this.b;
}
let objB = new B(10, 55);
console.log(objB * 1);     // 55

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов