Težava z zasebnimi lastnostmi pri dedovanju v OOP v JavaScriptu

Dejstvo, da zasebne lastnosti niso podedovane, lahko vodi do nepričakovane težave. Poglejmo si primer. Recimo, da imamo naslednji starševski razred z zasebno lastnostjo:

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

Recimo, da smo v podrejenem razredu odločili narediti metodo, ki bo povečala starost za ena. Vendar, poskus spreminjanja zasebne lastnosti starša bo povzročil napako:

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

Napaka bo izginila, če v podrejenem razredu deklariramo zasebno lastnost #age:

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

Tu nas čaka past! V resnici smo ustvarili dve zasebni lastnosti: eno v staršu in eno v potomcu. In delujeta povsem neodvisno. To pomeni, da bodo metode starša spreminjale svojo lastnost, metode potomca pa svojo.

Ta problem ima pravzaprav rešitev. Preprosto je treba manipulirati z zasebnimi lastnostmi starša prek metod tega starša. Prepišimo našo kodo v skladu s tem:

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

Lahko poenostavimo:

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

V naslednji kodi se v podrejenem razredu prepiše metoda starša. Popravite težave v tej kodi:

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