Как происходит создание readonly методов в классе?
Допустим у меня есть три экземпляра класса Worker, которые пушатся в массив EMPLOYEE. Один из этих экземпляров является экземпляром класса Manager, который наследуется от Worker (У Manager position всегда равна "Manager"). Также у класса Manager есть метод, который возвращает всех работников из его department. Как его сделать ридонли? Если я хочу в будущем сделать функцию, которая будет позволять Manager'aм (допустим) менять salary у сотрудников его отдела.
class Worker {
constructor(obj) {
this.id = obj.id
this.name = obj.name
this.position = obj.position
this.department = obj.department
this.salary = obj.salary
Worker.EMPLOYEE.push(this)
}
}
Worker.EMPLOYEE = new Array
class Manager extends Worker {
constructor(obj) {
super(obj)
this.position = 'Manager'
}
managedEmployees () {
let filteredArr = Worker.EMPLOYEE.filter(el => el.department === this.department && el !== this)
}
}
Ответы (1 шт):
Если я правильно понимаю и вам нужно избежать такого:
class Worker { }
class Manager extends Worker {
managedEmployees () {
console.log('1');
}
}
const m = new Manager();
m.managedEmployees(); // 1
Manager.prototype.managedEmployees = function () {
console.log('2');
}
m.managedEmployees(); // 2
m.managedEmployees = function () {
console.log('3');
}
m.managedEmployees(); // 3
Тогда можно при помощи Object.defineProperty() — все параметры по умолчанию false и это не даёт переопределить метод в прототипе или создать его в экземпляре (ошибки возникают только в строгом режиме, в нестрогом попытки перезаписи просто игнорируются):
'use strict';
class Worker { }
class Manager extends Worker { }
Object.defineProperty(Manager.prototype, 'managedEmployees', {
value: function () {
console.log('1');
},
});
const m = new Manager();
m.managedEmployees(); // 1
try {
Manager.prototype.managedEmployees = function () {
console.log('2');
}
m.managedEmployees();
} catch (err) {
console.error(err.message);
// TypeError: Cannot assign to read only property 'managedEmployees' of object '#<Manager>'
}
try {
m.managedEmployees = function () {
console.log('3');
}
m.managedEmployees();
} catch (err) {
console.error(err.message);
// TypeError: Cannot assign to read only property 'managedEmployees' of object '#<Manager>'
}