JavaScript-da OOP-da Kontekstni Yo'qotish

Klasslar bilan ishlashda kontekst yo'qolishi mumkin va this klass ob'ektiga emas, boshqa narsaga isora qiladi. Keling, bu qanday sodir bo'lishi va nima qilish kerakligini ko'rib chiqaylik.

Faraz qilaylik, bizda User klassi bor, u foydalanuvchi nomi va ushbu foydalanuvchi bo'lgan shaharlar massivini o'z ichiga oladi:

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

Faraz qilaylik, shaharlarni chiqaradigan usul mavjud:

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

Faraz qilaylik, ushbu usulda biz klassning ba'zi yordamchi usulidan foydalanishga qaror qildik. Bunda kontekst yo'qoladi:

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

Muammoni, masalan, o'q funktsiyasini kiritish orqali tuzatish mumkin:

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

Quyidagi kodda qilingan xatoni tuzating:

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