Вопрос синтаксиса объектно-ориентированного программирования, передача метода класса из одного файла в другой

#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. @Мордред Я обязательно задам один вопрос, как мне принять ответ? Я новичок в этой платформе и кодировании, и, похоже, я не могу найти кнопку, кроме как ответить на ваш вопрос, который, похоже, подсказывает мне ответ. Кроме того, как бы я сделал массив идентификаторов сотрудников? Точно так же, как я поступил с управляющими сотрудниками?