Het probleem van private eigenschappen bij overerving in OOP in JavaScript

Het feit dat private eigenschappen niet worden geërfd, kan tot een onverwacht probleem leiden. Laten we een voorbeeld bekijken. Stel dat we de volgende ouderklasse hebben met een private eigenschap:

javascriptclass User {
  #age;
  
  setAge(age) {
    this.#age = age;
  }
  getAge() {
    return this.#age;
  }
}

Stel dat we in de subklasse een methode willen maken die de leeftijd met één verhoogt. Een poging om de private eigenschap van de ouder te wijzigen zal echter tot een fout leiden:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // fout
  }
}

De fout verdwijnt als in de subklasse de private eigenschap #age wordt gedeclareerd:

javascriptclass Student extends User {
  #age;
  
  incAge() {
    this.#age++;
  }
}

Hier wacht de valstrik! In werkelijkheid hebben we twee private eigenschappen gecreëerd: één in de ouder en één in de nakomeling. En ze werken volledig onafhankelijk. Dit betekent dat methoden van de ouder hun eigen eigenschap zullen wijzigen, en methoden van de nakomeling - die van hen.

Dit probleem heeft eigenlijk een oplossing. Je moet gewoon de private eigenschappen van de ouder manipuleren via de methoden van die ouder. Laten we onze code herschrijven in overeenstemming hiermee:

javascriptclass Student extends User {
  incAge() {
    let age = this.getAge();
    age++;
    this.setAge(age);
  }
}

Kan worden vereenvoudigd:

javascriptclass Student extends User {
  incAge() {
    this.setAge(++this.getAge());
  }
}
Задание 1

In de volgende code wordt in de subklasse een methode van de ouder overschreven. Herstel de problemen in deze code:

javascriptclass User {
  #name;
  
  setName(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

class Employee extends User {
  setName(name) {
    if (name.length > 0) {
      this.#name = name;
    }
  }
}