Problemet med private egenskaber ved arv i OOP i JavaScript

At private egenskaber ikke nedarves, kan føre til et uventet problem. Lad os se på et eksempel. Lad os sige, at vi har følgende forældreklasse med en privat egenskab:

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

Lad os sige, at vi i barneklassen besluttede at lave en metode, der vil forøge alderen med én. Men et forsøg på at ændre forælderens private egenskab vil føre til en fejl:

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

Fejlen forsvinder, hvis man i barneklassen deklarerer den private egenskab #age:

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

Det er her, fælden venter på os! Faktisk har vi skabt to private egenskaber: én i forælderen og én i barnet. Og de fungerer fuldstændig uafhængigt. Det betyder, at forælderens metoder vil ændre deres egen egenskab, og barnets metoder - deres egne.

Dette problem har faktisk en løsning. Man skal blot manipulere forælderens private egenskaber via forælderens metoder. Lad os omskrive vores kode i overensstemmelse hermed:

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

Kan forenkles:

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

I følgende kode i barnet overskrives forælderens metode. Ret problemerne i denne kode:

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