Problem privatnih svojstava pri nasleđivanju u OOP u JavaScript-u
To što privatna svojstva nisu nasleđena, može dovesti do neočekivanog problema. Hajde da pogledamo na primeru. Neka imamo sledeći roditeljski klasa sa privatnim svojstvom:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Neka u izvedenom klasu rešimo da napravimo metod, koji će povećavati godine za jedan. Međutim, pokušaj da se izmeni privatno svojstvo roditelja dovesti će do greške:
class Student extends User {
incAge() {
this.#age++; // greška
}
}
Greška će nestati, ako u izvedenom klasu
deklarišemo privatno svojstvo #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Tu nas i čeka zamka! U stvari, stvorili smo dva privatna svojstva: jedno u roditelju i jedno u potomku. I ona rade potpuno nezavisno. Ovo znači, da će metodi roditelja menjati svoje svojstvo, a metodi potomka - svoje.
Ovaj problem zapravo ima rešenje. Jednostavno treba manipulisati privatnim svojstvima roditelja preko metoda tog roditelja. Hajde da prepišemo naš kod u skladu sa ovim:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Može se pojednostaviti:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
U sledećem kodu u izvedenom klasu redefiniše se metod roditelja. Ispravite probleme u ovom kodu:
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;
}
}
}