Problemet med private egenskaber ved arv i OOP i JavaScript
At private egenskaber ikke nedarves, kan føre til et uventet problem. Lad os se på et eksempel. Lad os sige, at vi har følgende forældreklasse med en privat egenskab:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Lad os sige, at vi i barneklassen besluttede at lave en metode, der vil forøge alderen med én. Men et forsøg på at ændre forælderens private egenskab vil føre til en fejl:
class Student extends User {
incAge() {
this.#age++; // fejl
}
}
Fejlen forsvinder, hvis man i barneklassen
deklarerer den private egenskab #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Det er her, fælden venter på os! Faktisk har vi skabt to private egenskaber: én i forælderen og én i barnet. Og de fungerer fuldstændig uafhængigt. Det betyder, at forælderens metoder vil ændre deres egen egenskab, og barnets metoder - deres egne.
Dette problem har faktisk en løsning. Man skal blot manipulere forælderens private egenskaber via forælderens metoder. Lad os omskrive vores kode i overensstemmelse hermed:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Kan forenkles:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
I følgende kode i barnet overskrives forælderens metode. Ret problemerne i denne kode:
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;
}
}
}