Masalah Properti Privat dalam Pewarisan OOP di JavaScript

Fakta bahwa properti privat tidak diwariskan dapat menyebabkan masalah yang tidak terduga. Mari kita lihat contohnya. Misalkan kita memiliki kelas induk berikut dengan properti privat:

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

Misalkan di kelas turunan kita memutuskan untuk membuat metode yang akan menambah usia sebanyak satu. Namun, upaya untuk mengubah properti privat induk akan menyebabkan error:

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

Error akan hilang jika di kelas turunan kita mendeklarasikan properti privat #age:

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

Di sinilah jebakannya mengintai kita! Sebenarnya, kita menghasilkan dua properti privat: satu di induk dan satu di turunan. Dan keduanya bekerja sepenuhnya independen. Ini berarti bahwa metode induk akan mengubah propertinya sendiri, dan metode turunan - properti mereka sendiri.

Masalah ini sebenarnya memiliki solusi. Hanya perlu memanipulasi properti privat induk melalui metode induk itu sendiri. Mari kita tulis ulang kode kita sesuai dengan ini:

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

Dapat disederhanakan:

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

Dalam kode berikut, di kelas turunan metode induk ditimpa. Perbaiki masalah dalam kode ini:

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