Как происходит создание 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 шт):

Автор решения: vsemozhebuty

Если я правильно понимаю и вам нужно избежать такого:

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

→ Ссылка