Problemet med privata egenskaper vid arv i OOP i JavaScript
Att privata egenskaper inte ärvs kan leda till ett oväntat problem. Låt oss titta på ett exempel. Antag att vi har följande föräldraklass med en privat egenskap:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Antag att vi i barnklassen bestämmer oss för att skapa en metod som kommer att öka åldern med ett. Försöket att ändra förälderns privata egenskap kommer dock att leda till ett fel:
class Student extends User {
incAge() {
this.#age++; // fel
}
}
Felet försvinner om man i barnklassen
deklarerar den privata egenskapen #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Det är här fällan väntar på oss! I verkligheten har vi skapat två privata egenskaper: en i föräldern och en i barnet. Och de fungerar helt oberoende. Det betyder att förälderns metoder kommer att ändra sin egen egenskap, och barnets metoder - sina egna.
Detta problem har faktiskt en lösning. Man behöver bara manipulera förälderns privata egenskaper genom förälderns metoder. Låt oss skriva om vår kod i enlighet med detta:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Kan förenklas:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
I följande kod i barnklassen åsidosätts föräldermetoden. Rätta problemen i denna 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;
}
}
}