Privačių savybių paveldėjimo problema OOP JavaScripte
Tai, kad privačios savybės nepaveldimos, gali sukelti netikėtą problemą. Pažiūrėkime pavyzdžiu. Tarkime, kad turime šį tėvinę klasę su privačia savybe:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Tarkime, kad vaikinėje klasėje nusprendėme sukurti metodą, kuris padidins amžių vienetu. Tačiau bandymas pakeisti tėvinę privačią savybę sukels klaidą:
class Student extends User {
incAge() {
this.#age++; // klaida
}
}
Klaida išnyks, jei vaikinėje klasėje
deklaruosite privačią savybę #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Štai čia mūsų ir laukia spastai! Iš tiesų mes sukūrėme dvi privačias savybes: vieną tėvinėje klasėje ir vieną vaikinėje. Ir jos veikia visiškai nepriklausomai. Tai reiškia, kad tėviniai metodai keis savo savybę, o vaikiniai metodai - savo.
Ši problema iš tikrųjų turi sprendimą. Tiesiog reikia manipuliuoti tėvinėmis privačiomis savybėmis per tos tėvinės klasės metodus. Perrašykime mūsų kodą pagal tai:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Galima supaprastinti:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Toliau pateiktame kode vaikinėje klasėje perrašomas tėvinis metodas. Ištaisykite problemas šiame 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;
}
}
}