Verlust des Kontexts in OOP in JavaScript
Bei der Arbeit mit Klassen kann der
Kontext verloren gehen und this zeigt
nicht auf das Klassenobjekt, sondern auf
etwas anderes.
Lassen Sie uns sehen, wie das passieren kann
und was man dagegen tun kann.
Angenommen, wir haben eine Klasse User,
die den Namen des Benutzers und ein Array
der Städte enthält, in denen sich dieser Benutzer
aufgehalten hat:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Angenommen, es gibt eine Methode, die die Städte ausgibt:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Angenommen, wir haben in dieser Methode beschlossen, eine bestimmte Hilfsmethode der Klasse zu verwenden. In diesem Fall geht der Kontext verloren:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(this.#cape(city)); // Kontext ist verloren
});
}
#cape(str) {
return str[0].toUpperCase() + str.slice(1);
}
}
Das Problem kann beispielsweise behoben werden, indem man eine Pfeilfunktion verwendet:
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
Korrigieren Sie den Fehler, der im folgenden Code gemacht wurde:
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);