Konteksta zudums OOP JavaScript

Strādājot ar klasēm, var pazust konteksts un this norādīs ne uz klases objektu, bet uz kaut ko citu. Apskatīsim, kā tas var notikt un ko ar to darīt.

Pieņemsim, ka mums ir klase User, kura satur lietotāja vārdu un masīvu ar pilsētām, kurās šis lietotājs atradies:

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

Pieņemsim, ka ir metode, kas izvada pilsētas:

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

Pieņemsim, ka šajā metodē mēs nolēmām izmantot kādu klases palīgmetodi. Šajā gadījumā konteksts pazudīs:

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

Problēmu var izlabot, piemēram, ievadot bultu funkciju:

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

Izlabojiet kļūdu, kas pieļauta sekojošā kodā:

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);