Я не хочу вызывать родительский конструктор. Можем ли мы что-нибудь с этим сделать?

Я пытаюсь изучить классы 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();

Вам следует использовать super()

Subha 24.06.2024 11:11

Тогда не продлевай от Employee?

gre_gor 24.06.2024 11:11

Что, если я захочу позже использовать членов-сотрудников в учащемся?

Tazeen Khan 24.06.2024 11:12

«Я просто хочу вызвать конструктор дочернего класса.»: это противоречит дизайну ООП: когда вы создаете экземпляр «Ученик», вы создаете экземпляр «Сотрудник», что включает в себя запуск его конструктора.

trincot 24.06.2024 11:13

В Java у нас есть возможность вызывать родительский элемент или нет. Это также следует за ООП, верно?

Tazeen Khan 24.06.2024 11:14

Если вы переводите свой JS-код на Java, вызываются оба конструктора. Не уверен, о чем вы говорите.

trincot 24.06.2024 11:18

Откуда взялось это «требование»? Хотя бы потому, что в настоящее время вы получаете оба оператора console.info, когда создаете Learner - тогда для начала прекратите делать такие выводы в конструкторах.

CBroe 24.06.2024 11:19

Обязательный комментарий «композиция важнее наследования» для проекта, который, похоже, использует наследование для совместного использования кода вместо композиции, что является подходящим инструментом для этой работы.

VLAZ 24.06.2024 11:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
8
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это невозможно и противоречит принципам ООП.

Чтобы получить доступ к одним и тем же методам и свойствам как в Сотруднике, так и в Учащемся, не вызывая конструктор другого, создайте родительский класс с именем типа «Человек» с отдельными конструкторами для Сотрудника и Учащегося.

Итак, 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();

Другие вопросы по теме