Проблема приватных свойств при наследовании в ООП в JavaScript
То, что приватные свойства не наследуются, может привести к неожиданной проблеме. Давайте посмотрим на примере. Пусть у нас есть следующий класс-родитель с приватным свойством:
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;
}
}
}