JavaScript'те ООП'де контексттин жоголушу

Класстар менен иштөө убагында контекст жоголуп кетиши мүмкүн, жана this класстын объектисине эмес, башка нерсеге тиешелүү болуп калат. Келгиле, бул кантип болушу мүмкүн жана аны менен эмне кылуу керек экенин көрөлү.

Анда бизде User классы бар болсун, ал колдонуучунун атын жана бул колдонуучу болгон шаарлардын тизмесин камтыйт:

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

Шаарларды чыгаруучу методу бар болсун:

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

Бул методдо биз класстын кээ бир жардамчы методунан пайдалангыбыз келсин. Бул учурда контекст жоголуп калат:

javascriptclass User {
  constructor(name, cities) {
    this.name = name;
    this.cities = cities;
  }
  
  showCities() {
    this.cities.forEach(function(city) {
      console.log(this.#cape(city)); // контекст жоголду
    });
  }
  
  #cape(str) {
    return str[0].toUpperCase() + str.slice(1);
  }
}

Маселени, мисалы, өркөч функциясын киргизүү менен чечсе болот:

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

Төмөнкү коддогу катаны оңдоп:

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