Почему я не могу условно расширить пользовательский класс элемента HTML?

В приведенном ниже фрагменте выдается ошибка, которая CustomElementParent не определена, когда я пытаюсь расширить ее в CustomElementChild.

Когда я снимаю флажок ! customElements.get('custom-element-parent'), все работает.

В моем случае CustomElementParent находится в стороннем скрипте, поэтому я не могу удалить оператор if.

Я думаю, это проблема условного определения класса. Есть ли способ расширить этот класс, если он определен условно?

<script>
if (! customElements.get('custom-element-parent')) {
    class CustomElementParent extends HTMLElement {
        constructor() {
            super();
        }
    }

    customElements.define('custom-element-parent', CustomElementParent);
}

if (! customElements.get('custom-element-child')) {
    class CustomElementChild extends CustomElementParent {
        constructor() {
            super();
            alert('test');
        }
    }

    customElements.define('custom-element-child', CustomElementChild);
}
</script>

<custom-element-child></custom-element-child>

Проблема в масштабах. class ограничено оператором if, поэтому CustomElementParent выходит за рамки, когда вы доберетесь до определения CustomElementChild.

Barmar 06.04.2024 05:34
Поведение ключевого слова "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) для оценки ваших знаний,...
0
1
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Объем. Классы имеют область действия, такую ​​же, как и переменные.

if (true) {
    let x = 5;
}

// you can’t access `x` here

(Мы не говорим о var. Дело в том, что class работает как объявления let/const/function в строгом режиме.)

Если вы не можете изменить область действия CustomElementParent и не можете поместить свой код в ее область действия, вы не сможете получить к нему доступ таким образом. Вместо этого вы можете посмотреть его в реестре пользовательских элементов:

const CustomElementParent = customElements.get('custom-element-parent');

Полный пример:

{
    class Hidden extends HTMLElement {
        constructor() {
            super();
            console.info('parent');
        }
    }

    customElements.define('custom-element-parent', Hidden);
}

const CustomElementParent = customElements.get('custom-element-parent');

class CustomElementChild extends CustomElementParent {
    constructor() {
        super();
        console.info('child');
    }
}

customElements.define('custom-element-child', CustomElementChild);
<custom-element-child></custom-element-child>

«Одним из вариантов может быть создание элемента этого типа, чтобы получить к нему доступ» — не усложняйте задачу. customElements.get('custom-element-parent') подойдёт!

Bergi 06.04.2024 05:43

@Bergi: ошеломлен

Ry- 06.04.2024 06:11

Я никогда раньше не работал с пользовательскими элементами, я просто увидел это в вопросе и задался вопросом, что он делает :-)

Bergi 06.04.2024 06:12

Как и let и const, объявления class имеют блочную область действия. Таким образом, областью действия объявления CustomElementParent является блок if, и он недоступен, когда вы доберетесь до второго блока if.

Вы можете решить эту проблему, объявив имена вне области видимости, а затем назначив их с помощью выражений класса.

var CustomElementParent, CustomElementChild;

if (!customElements.get('custom-element-parent')) {
  CustomElementParent = class CustomElementParent extends HTMLElement {
    constructor() {
      super();
    }
  }

  customElements.define('custom-element-parent', CustomElementParent);
}

if (!customElements.get('custom-element-child')) {
  CustomElementChild = class CustomElementChild extends CustomElementParent {
    constructor() {
      super();
      alert('test');
    }
  }

  customElements.define('custom-element-child', CustomElementChild);
}
<custom-element-child></custom-element-child>

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

Вызов функции класса только один раз при изменении переменной
RangeError: превышен максимальный размер стека вызовов – Typescript
Почему редактирование значения с использованием указателя, то есть частного поля класса, требует объявления дополнительной переменной?
Как устранить ошибку компилятора: в моем случае нет соответствующей функции для вызова dmhFS::dmhFS()?
Getter возвращает неопределенное значение в операторе if. Кажется, не работает для сравнения
Как сохранить/получить информацию о классе в/из таблицы?
C++: Как реализовать указатель на другой класс в качестве члена?
Как сделать так, чтобы я мог передать указатель класса на другой класс, который был объявлен из первого класса
Является ли использование классов и частных полей в качестве альтернативы переменным среды плохой идеей?
Конфликтующее объявление при передаче потока файлов в конструктор