Kehilangan Konteks dalam OOP di JavaScript
Semasa bekerja dengan kelas, konteks boleh hilang
dan this akan menunjuk
bukan pada objek kelas, tetapi pada sesuatu yang lain.
Mari kita lihat bagaimana ini boleh berlaku
dan apa yang perlu dilakukan.
Katakan kita mempunyai kelas User,
yang mengandungi nama pengguna dan array
bandar-bandar yang dilawati oleh pengguna ini:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
}
Katakan terdapat kaedah yang memaparkan bandar-bandar:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(city);
});
}
}
Katakan dalam kaedah ini, kami memutuskan untuk menggunakan beberapa kaedah pembantu kelas. Dalam kes ini, konteks akan hilang:
javascriptclass User {
constructor(name, cities) {
this.name = name;
this.cities = cities;
}
showCities() {
this.cities.forEach(function(city) {
console.log(this.#cape(city)); // konteks hilang
});
}
#cape(str) {
return str[0].toUpperCase() + str.slice(1);
}
}
Masalah boleh diperbaiki, contohnya, dengan menggunakan fungsi anak panah:
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
Betulkan ralat yang dilakukan dalam kod berikut:
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);