Verlies van context in OOP in JavaScript
Bij het werken met klassen kan de context
verloren gaan en zal this niet wijzen
naar het object van de klasse, maar naar iets anders.
Laten we kijken hoe dit kan gebeuren
en wat we eraan kunnen doen.
Stel dat we een klasse User hebben,
die de naam van de gebruiker en een array
van steden bevat waar deze gebruiker
is geweest:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Stel dat er een methode is die de steden weergeeft:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Stel dat we in deze methode besloten hebben een bepaalde hulpmethode van de klasse te gebruiken. In dit geval zal de context verloren gaan:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(this.#cape(city)); // context verloren
});
}
#cape(str) {
return str[0].toUpperCase() + str.slice(1);
}
}
Het probleem kan worden opgelost, bijvoorbeeld door een pijlfunctie te introduceren:
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
Repareer de fout die gemaakt is in de volgende code:
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);