Privaatse omaduste pärimise probleem OOP-s JavaScriptis
Asjaolu, et privaatsed omadused ei pärine, võib viia ootamatu probleemini. Vaatame näidet. Olgu meil järgmine vanemaklass privaatse omadusega:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Oletame, et lapsklassis otsustasime teha meetodi, mis suurendab vanust ühe võrra. Siiski, katse muuta vanema privaatset omadust viib veani:
class Student extends User {
incAge() {
this.#age++; // viga
}
}
Viga kaob, kui lapsklassis
deklareerida privaatne omadus #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Siin ootabki meid lõks! Tegelikult loome kaks privaatset omadust: üks vanemas ja üks lapses. Ja need töötavad täiesti sõltumatult. See tähendab, et vanema meetodid muudavad oma omadust ja lapse meetodid - oma omadust.
Sellel probleemil on tegelikult lahendus. Lihtsalt tuleb manipuleerida vanema privaatsete omadustega läbi selle vanema meetodite. Kirjutame oma koodi vastavalt sellele ümber:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Saab lihtsustada:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Järgmises koodis kirjutatakse lapsklassis üle vanema meetod. Parandage probleemid selles koodis:
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;
}
}
}