პრივატული თვისებების მემკვიდრეობის პრობლემა OOP-ში JavaScript-ში
ის, რომ პრივატული თვისებები არ მემკვიდრეობდება, შეიძლება მოულოდნელ პრობლემას გამოიწვიოს. მოდით შევხედოთ მაგალითს. დავუშვათ, გვაქვს შემდეგი მშობელი კლასი პრივატული თვისებით:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
დავუშვათ, შვილობილ კლასში გადავწყვიტეთ გავაკეთოთ მეთოდი, რომელიც გაზრდის ასაკს ერთეულით. თუმცა, მშობლის პრივატული თვისების შეცვლის მცდელობა შეცდომას გამოიწვევს:
class Student extends User {
incAge() {
this.#age++; // შეცდომა
}
}
შეცდომა გაქრება, თუ შვილობილ კლასში
გამოვაცხადებთ პრივატულ თვისებას #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
აი, სად ელის ხაფანგი ჩვენ! სინამდვილეში ჩვენ ორი პრივატული თვისება შევქმენით: ერთი მშობელში და ერთი შვილობილში. და ისინი მუშაობენ სრულიად დამოუკიდებლად. ეს ნიშნავს, რომ მშობლის მეთოდები შეცვლიან საკუთარ თვისებას, ხოლო შვილობილის მეთოდები - საკუთარს.
ამ პრობლემას სინამდვილეში აქვს გამოსავალი. უბრალოდ საჭიროა მანიპულირება მშობლის პრივატული თვისებებით ამ მშობლის მეთოდების მეშვეობით. მოდით გადავწეროთ ჩვენი კოდი ამის შესაბამისად:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
შესაძლებელია გამარტივება:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
შემდეგ კოდში შვილობილ კლასში გადაფარდება მშობლის მეთოდი. გამასწორეთ პრობლემები ამ კოდში:
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;
}
}
}