Vấn đề thuộc tính private khi kế thừa trong OOP JavaScript
Việc các thuộc tính private không được kế thừa có thể dẫn đến một vấn đề bất ngờ. Hãy xem xét ví dụ sau. Giả sử chúng ta có một lớp cha với một thuộc tính private:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Giả sử trong lớp con, chúng ta quyết định tạo một phương thức để tăng tuổi lên một. Tuy nhiên, nỗ lực thay đổi thuộc tính private của lớp cha sẽ dẫn đến lỗi:
class Student extends User {
incAge() {
this.#age++; // lỗi
}
}
Lỗi sẽ biến mất nếu trong lớp con
khai báo thuộc tính private #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Đây chính là cái bẫy đang chờ chúng ta! Trên thực tế, chúng ta đã tạo ra hai thuộc tính private: một ở lớp cha và một ở lớp con. Và chúng hoạt động hoàn toàn độc lập. Điều này có nghĩa là các phương thức của lớp cha sẽ thay đổi thuộc tính của riêng nó, còn các phương thức của lớp con - thuộc tính của riêng chúng.
Vấn đề này thực ra có cách giải quyết. Chỉ cần thao tác với thuộc tính private của lớp cha thông qua các phương thức của chính lớp cha đó. Hãy viết lại mã của chúng ta theo cách này:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Có thể đơn giản hóa:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Trong mã sau, lớp con ghi đè phương thức của lớp cha. Hãy sửa các vấn đề trong mã này:
class User {
#name;
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
class Employee extends User {
setName(name) {
if (name.length > 0) {
this.#name = name;
}
}
}