Privāto īpašību problēma mantojumā OOP JavaScript
Tas, ka privātās īpašības nemantojas, var izraisīt negaidītu problēmu. Apskatīsim piemērā. Pieņemsim, ka mums ir šāds vecāku klase ar privātu īpašību:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Pieņemsim, ka bērna klasē mēs nolēmām izveidot metodi, kas palielinās vecumu par vienu. Tomēr mēģinājums mainīt vecāka privāto īpašību izraisīs kļūdu:
class Student extends User {
incAge() {
this.#age++; // kļūda
}
}
Kļūda pazudīs, ja bērna klasē
deklarēsiet privāto īpašību #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Šeit mūs sagaida lamatas! Patiesībā mēs esam radījuši divas privātās īpašības: vienu vecākā un vienu bērna klasē. Un tās darbojas pilnīgi neatkarīgi. Tas nozīmē, ka vecāka metodes mainīs savu īpašību, un bērna metodes - savu.
Šai problēmai patiesībā ir risinājums. Vienkārši privātās īpašības ir jāmaina caur šī vecāka metodēm. Pārrakstīsim mūsu kodu saskaņā ar to:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Var vienkāršot:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Zemāk esošajā kodā bērna klasē tiek pārdefinēta vecāka metode. Izlabojiet problēmas šajā kodā:
class User {
#name;
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
class Employee extends User {
setName(name) {
if (name.length > 0) {
this.#name = name;
}
}
}