Perdita del Contesto nella OOP in JavaScript
Quando si lavora con le classi, il contesto può perdersi
e this punterà
non all'oggetto della classe, ma a qualcos'altro.
Vediamo come può succedere
e cosa fare al riguardo.
Supponiamo di avere una classe User,
che contiene il nome dell'utente e un array
delle città in cui questo utente
è stato:
class User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Supponiamo ci sia un metodo che stampa le città:
class User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Supponiamo che in questo metodo abbiamo deciso di usare qualche metodo helper della classe. In questo caso il contesto andrà perso:
class User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(this.#cape(city)); // il contesto è andato perso
});
}
#cape(str) {
return str[0].toUpperCase() + str.slice(1);
}
}
Si può risolvere il problema, ad esempio, introducendo una funzione freccia:
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);
}
}
Correggi l'errore commesso nel seguente codice:
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);