Middle+
Uitați codul cu clasa care are un constructor cu câmpul multiplier, metoda add pentru adăugarea numerelor în array și metoda getMultiSum, implementată printr-o funcție obișnuită. Ce va fi afișat în consolă la rularea acestui cod?
sobes.tech AI
Răspuns de la AI
Если метод getMultiSum реализован через обычную function, а не стрелочную, то внутри него this не будет ссылаться на экземпляр класса, а будет либо undefined (в строгом режиме), либо глобальным объектом (в нестрогом). В результате, при попытке доступа к this.multiplier или this.numbers внутри такого метода возникнет ошибка или undefined.
Пример:
class Example {
constructor(multiplier) {
this.multiplier = multiplier;
this.numbers = [];
}
add(num) {
this.numbers.push(num);
}
getMultiSum() {
return this.numbers.reduce(function(sum, num) {
return sum + num * this.multiplier; // this здесь не тот, что ожидается
}, 0);
}
}
const ex = new Example(2);
ex.add(1);
ex.add(2);
console.log(ex.getMultiSum()); // Ошибка или NaN
Чтобы исправить, можно использовать стрелочную функцию внутри reduce, которая захватывает this из внешнего контекста:
getMultiSum() {
return this.numbers.reduce((sum, num) => sum + num * this.multiplier, 0);
}
Или сохранить this в переменную self перед вызовом функции.