Я пытаюсь изучить классы JS и получаю сообщение об ошибке, если не звоню super().
ReferenceError: необходимо вызвать суперконструктор в производном классе перед доступом к «этому» или возврату из производного конструктора.
Мое требование состоит в том, что я просто хочу вызвать конструктор дочернего класса. Могу ли я сделать это?
class Employee {
constructor() {
console.info("I am an employee")
}
}
class Learner extends Employee {
constructor() {
console.info("I am a learner")
}
}
var learner = new Learner();
Тогда не продлевай от Employee?
Что, если я захочу позже использовать членов-сотрудников в учащемся?
«Я просто хочу вызвать конструктор дочернего класса.»: это противоречит дизайну ООП: когда вы создаете экземпляр «Ученик», вы создаете экземпляр «Сотрудник», что включает в себя запуск его конструктора.
В Java у нас есть возможность вызывать родительский элемент или нет. Это также следует за ООП, верно?
Если вы переводите свой JS-код на Java, вызываются оба конструктора. Не уверен, о чем вы говорите.
Откуда взялось это «требование»? Хотя бы потому, что в настоящее время вы получаете оба оператора console.info, когда создаете Learner - тогда для начала прекратите делать такие выводы в конструкторах.
Обязательный комментарий «композиция важнее наследования» для проекта, который, похоже, использует наследование для совместного использования кода вместо композиции, что является подходящим инструментом для этой работы.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это невозможно и противоречит принципам ООП.
Чтобы получить доступ к одним и тем же методам и свойствам как в Сотруднике, так и в Учащемся, не вызывая конструктор другого, создайте родительский класс с именем типа «Человек» с отдельными конструкторами для Сотрудника и Учащегося.
Итак, Employee extends Person и Learner extends Person. Затем поместите общие методы и атрибуты внутри Person.
Создавая экземпляр Learner, вы создаете экземпляр Employee. Ожидается, что конструктор запускается при создании экземпляра класса.
Если у вас есть сценарии, в которых вы не хотите запускать код в этом конструкторе, то, очевидно, этот код на самом деле не является кодом, необходимым для создания объекта, и его следует переместить в другое место.
Например, вот так:
class Employee {
outputName() {
console.info("I am an employee")
}
}
class Learner extends Employee {
outputName() {
console.info("I am a learner")
}
}
var learner = new Learner();
learner.outputName();Или сделайте конструктор Employee более универсальным, чтобы он делал то, что вам нужно, и для любого экземпляра подкласса. Например,
function addArticle(subject) {
return ("aeiouAEIOU".includes(subject[0]) ? "an " : "a ") + subject;
}
class Employee {
constructor() {
const className = addArticle(this.constructor.name);
console.info("I am " + className);
}
}
class Learner extends Employee {
}
var learner = new Learner();
Вам следует использовать
super()