#javascript #object #oop #methods #commonjs
Вопрос:
У меня есть два файла, employee.js
const Manager = require('./manager.js'); let manager = new Manager(); class Employee { constructor(name, title, salary, boss=null) { this.name = name; this.title = title; this.salary = salary; this.boss = boss; manager.addEmployee(this.Employee); } } module.exports = Employee;
И manager.js
const Employee = require('./employee.js'); class Manager extends Employee { constructor(name, salary, title, boss=null) { // this.name = name; // this.title = title; // this.salary = salary; // this.boss = boss; super(name, salary, title, boss); this.managedEmployees = []; } addEmployee(Employee) { this.managedEmployees.push(Employee); } } let annie = new Manager('annie', 100000, 'Director'); let alvy = new Employee('alvy', 75000, 'Analyst', annie); console.log(annie); module.exports = Manager;
Я отчаянно пытаюсь найти синтаксис, который позволил бы мне взять метод addEmployee(Сотрудник) и вызвать его в конструкторе класса Employee. Я хочу, чтобы менеджер был дочерним по отношению к сотруднику и имел множество всех сотрудников под руководством менеджера. Метод толкает в массив, но я не могу понять, что я должен делать console.log(annie);
, чтобы в итоге получить этот ввод
lt;ref *1gt; Manager { name: 'Annie', salary: 100000, title: 'Director', manager: null, employees: [ Employee { name: 'Alvy', salary: 75000, title: 'Analyst', manager: [Circular *1] } ] }
Комментарии:
1. Вы не определяете
this.Employee
свойство. Ты это имел в видуthis
? Каков ожидаемый результат? Что не так с текущим выходом?2. Я получал либо менеджер не определен, либо
TypeError: Class extends value [object Object] is not a constructor or null.
на самом деле это была не одна ошибка больше, так что я получил кучу ошибок, но приведенный ниже ответ исправил это с удалением двух верхних строк кода в employee.js
Ответ №1:
Настройте свой класс сотрудников следующим образом:
class Employee { constructor(name, title, salary, boss=null) { this.name = name; this.title = title; this.salary = salary; this.boss = boss; if (boss) { boss.addEmployee(this); } } }
Вы передаете менеджер instanceof, поэтому, если он не равен нулю, вы можете вызвать метод для этого. Обратите внимание , что вы хотите просто передать this
в качестве входных данных addEmployee
, как this.Employee
при попытке получить доступ к свойству или методу в этом классе, которого не существует.
Вывод консоли будет выглядеть примерно так:
Manager { name: "annie", title: 100000, salary: "Director", boss: null, managedEmployees: [ Employee { name: "alvy", title: 75000, salary: "Analyst", boss:Manager {...} } ] }
Вы также заметите, что у вас есть порядок изменения параметров для должности/зарплаты в конструкторе сотрудников.
Комментарии:
1. Это решило проблему, мне пришлось избавиться от
const Manager = require('./manager.js'); let manager = new Manager();
, а затем я ввел ваш код if (босс), и это сработало! спасибо, я так запутался в этом синтаксисе, это еще не весь проект, но я ценю, что вы помогаете мне продвигаться вперед.2. @MikelFisher Я бы рекомендовал иметь массив идентификаторов сотрудников вместо всего объекта сотрудника. Таким образом, он будет занимать меньше места, и вам нужно будет редактировать данные только в одном месте.
3. @MikelFisher Отлично. Убедитесь, что вы также видели мои правки. Если это решило все ваши проблемы, пожалуйста, примите ответ.
4. @Invizi Как написано в настоящее время, программа занимает не больше памяти, чем массив идентификаторов, потому
Manager
что будет содержать только ссылку наEmployee
объект, а не копию всего объекта. Я согласен, что это не обязательно лучшая практика, особенно когда вы начинаете манипулировать сотрудниками или передавать объект менеджера, но это не всегда будет проблемой памяти.5. @Мордред Я обязательно задам один вопрос, как мне принять ответ? Я новичок в этой платформе и кодировании, и, похоже, я не могу найти кнопку, кроме как ответить на ваш вопрос, который, похоже, подсказывает мне ответ. Кроме того, как бы я сделал массив идентификаторов сотрудников? Точно так же, как я поступил с управляющими сотрудниками?