Težava z zasebnimi lastnostmi pri dedovanju v OOP v JavaScriptu
Dejstvo, da zasebne lastnosti niso podedovane, lahko vodi do nepričakovane težave. Poglejmo si primer. Recimo, da imamo naslednji starševski razred z zasebno lastnostjo:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Recimo, da smo v podrejenem razredu odločili narediti metodo, ki bo povečala starost za ena. Vendar, poskus spreminjanja zasebne lastnosti starša bo povzročil napako:
class Student extends User {
incAge() {
this.#age++; // napaka
}
}
Napaka bo izginila, če v podrejenem razredu
deklariramo zasebno lastnost #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Tu nas čaka past! V resnici smo ustvarili dve zasebni lastnosti: eno v staršu in eno v potomcu. In delujeta povsem neodvisno. To pomeni, da bodo metode starša spreminjale svojo lastnost, metode potomca pa svojo.
Ta problem ima pravzaprav rešitev. Preprosto je treba manipulirati z zasebnimi lastnostmi starša prek metod tega starša. Prepišimo našo kodo v skladu s tem:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Lahko poenostavimo:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
V naslednji kodi se v podrejenem razredu prepiše metoda starša. Popravite težave v tej kodi:
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;
}
}
}