Pierderea contextului în OOP în JavaScript

În timpul lucrului cu clase, contextul se poate pierde și this va indica nu către obiectul clasei, ci către altceva. Să vedem cum se poate întâmpla acest lucru și ce putem face în legătură cu asta.

Să presupunem că avem clasa User, care conține numele utilizatorului și un array de orașe în care acest utilizator a fost:

javascriptclass User {
  constructor(name, cities) {
    this.name = name;
    this.cities = cities;
  }
}

Să presupunem că există o metodă care afișează orașele:

javascriptclass User {
  constructor(name, cities) {
    this.name = name;
    this.cities = cities;
  }
  
  showCities() {
    this.cities.forEach(function(city) {
      console.log(city);
    });
  }
}

Să presupunem că în această metodă am decis să folosim o anumită metodă auxiliară a clasei. În acest caz, contextul se va pierde:

javascriptclass User {
  constructor(name, cities) {
    this.name = name;
    this.cities = cities;
  }
  
  showCities() {
    this.cities.forEach(function(city) {
      console.log(this.#cape(city)); // contextul s-a pierdut
    });
  }
  
  #cape(str) {
    return str[0].toUpperCase() + str.slice(1);
  }
}

Putem remedia problema, de exemplu, prin utilizarea unei funcții săgeată:

javascriptclass User {
  constructor(name, cities) {
    this.name = name;
    this.cities = cities;
  }
  
  showCities() {
    this.cities.forEach(city => {
      console.log(this.#cape(city));
    });
  }
  
  #cape(str) {
    return str[0].toUpperCase() + str.slice(1);
  }
}
Задание 1

Corectați eroarea comisă în următorul cod:

javascriptclass Employee {
  constructor(name, salary, coeffs) {
    this.name = name;
    this.salary = salary;
    this.coeffs = coeffs;
  }
  
  getTotal() {
    return this.coeffs.reduce(function(res, coeff) {
      return res + this.salary * coeff;
    }, 0);
  }
}

let employee = new Employee('john', 1000, [1.1, 1.2, 1.3]);
let total = employee.getTotal();
console.log(total);