JavaScript'те ООП'де контексттин жоголушу
Класстар менен иштөө убагында
контекст жоголуп кетиши мүмкүн,
жана this класстын объектисине
эмес, башка нерсеге тиешелүү болуп калат.
Келгиле, бул кантип болушу мүмкүн
жана аны менен эмне кылуу керек экенин көрөлү.
Анда бизде User классы бар болсун,
ал колдонуучунун атын жана бул колдонуучу
болгон шаарлардын тизмесин камтыйт:
class User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Шаарларды чыгаруучу методу бар болсун:
class User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Бул методдо биз класстын кээ бир жардамчы методунан пайдалангыбыз келсин. Бул учурда контекст жоголуп калат:
class 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);
}
}
Маселени, мисалы, өркөч функциясын киргизүү менен чечсе болот:
class 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);
}
}
Төмөнкү коддогу катаны оңдоп:
class 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);