Problemet med privata egenskaper vid arv i OOP i JavaScript

Att privata egenskaper inte ärvs kan leda till ett oväntat problem. Låt oss titta på ett exempel. Antag att vi har följande föräldraklass med en privat egenskap:

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

Antag att vi i barnklassen bestämmer oss för att skapa en metod som kommer att öka åldern med ett. Försöket att ändra förälderns privata egenskap kommer dock att leda till ett fel:

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

Felet försvinner om man i barnklassen deklarerar den privata egenskapen #age:

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

Det är här fällan väntar på oss! I verkligheten har vi skapat två privata egenskaper: en i föräldern och en i barnet. Och de fungerar helt oberoende. Det betyder att förälderns metoder kommer att ändra sin egen egenskap, och barnets metoder - sina egna.

Detta problem har faktiskt en lösning. Man behöver bara manipulera förälderns privata egenskaper genom förälderns metoder. Låt oss skriva om vår kod i enlighet med detta:

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

Kan förenklas:

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

I följande kod i barnklassen åsidosätts föräldermetoden. Rätta problemen i denna kod:

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;
    }
  }
}