Konteksverlies in OOP in JavaScript
Wanneer met klasse gewerk word, kan die
konteks verlore gaan en sal this nie
na die klasvoorwerp wys nie, maar na iets anders.
Kom ons kyk hoe dit kan gebeur
en wat om daaraan te doen.
Laat ons 'n klas User hê,
wat die gebruiker se naam en 'n array
van stede bevat waarin hierdie gebruiker
was:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Laat daar 'n metode wees wat die stede uitskryf:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Laat ons in hierdie metode besluit om 'n sekere hulpmetode van die klas te gebruik. In hierdie geval sal die konteks verlore gaan:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(this.#cape(city)); // konteks verloor
});
}
#cape(str) {
return str[0].toUpperCase() + str.slice(1);
}
}
Die probleem kan reggestel word, byvoorbeeld, deur 'n pylfunksie te gebruik:
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
Korrigeer die fout wat in die volgende kode gemaak is:
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);