Праблема прыватных уласцівасцяў пры наследаванні ў ААП у JavaScript
Toе, што прыватныя ўласцівасці не наследуюцца, можа прывесці да нечаканай праблемы. Давайце паглядзім на прыкладзе. Хай у нас ёсць наступны клас-бацька з прыватным уласцівасцю:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Хай у класе-нашчадку мы вырашылі зрабіць метад, які будзе павялічваць ўзрост на адзінку. Аднак, спроба змяніць прыватнае ўласцівасць бацькі прывядзе да памылкі:
class Student extends User {
incAge() {
this.#age++; // памылка
}
}
Памылка знікне, калі ў класе-нашчадку
аб'явіць прыватнае ўласцівасць #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Тут-то нас і падпільноўвае пастка! На самай справе мы зрабілі два прыватныя ўласцівасці: адно ў бацьку і адно ў нашчадку. І яны працуюць цалкам незалежна. Гэта значыць, што метады бацькі будуць змяняць свой уласцівасць, а метады нашчадка - свае.
Гэтая праблема на самой справе мае рашэнне. Проста трэба маніпуляваць прыватнымі ўласцівасцямі бацькі праз метады гэтага бацькі. Давайце перапішам наш код у адпаведнасці з гэтым:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Можна спрасціць:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
У наступным кодзе ў класе нашчадка перавызначаецца метад бацькі. Выпраўце праблемы ў гэтым кодзе:
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;
}
}
}