Sobes.tech
Middle+

Mire el código con la clase que tiene un constructor con el campo multiplier, el método add para agregar números al array y el método getMultiSum, implementado mediante una función normal. ¿Qué se mostrará en la consola al ejecutar este código?

sobes.tech AI

Respuesta de la IA

Si el método getMultiSum está implementado mediante una función normal y no una flecha, entonces dentro de él this no hará referencia a la instancia de la clase, sino que será undefined (en modo estricto) o el objeto global (en modo no estricto). Como resultado, al intentar acceder a this.multiplier o this.numbers dentro de dicho método, se producirá un error o undefined.

Ejemplo:

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; // aquí `this` no es el esperado
    }, 0);
  }
}

const ex = new Example(2);
ex.add(1);
ex.add(2);
console.log(ex.getMultiSum()); // Error o NaN

Para corregirlo, se puede usar una función flecha dentro de reduce, que captura this del contexto externo:

getMultiSum() {
  return this.numbers.reduce((sum, num) => sum + num * this.multiplier, 0);
}

O guardar this en una variable self antes de llamar a la función.