Проблема приватных свойств при наследовании в ООП в 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; } } }