Можно ли наследоваться от класса с приватными конструкторами в JavaScript?

Наследование от классов с закрытыми конструкторами

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

В JavaScript прямой поддержки приватных конструкторов нет, но существуют способы их имитации. Я наткнулся на интересный пример, связанный с HTMLVideoElement. Этот класс вызывает ошибку Illegal constructor, если попытаться создать его через new HTMLVideoElement().

class MyCustomVideo extends HTMLVideoElement {
    constructor() {
        super();
    }
}

Тем не менее, когда я создаю подкласс, то могу сформировать его экземпляр с помощью new MyCustomVideo() без ошибок. Это работает только после выполнения команды customElements.define('my-custom-video', MyCustomVideo, { extends: 'video'}).

Если пропустить этот шаг, то конструктор снова вызовет исключение. Это поведение кажется наблюдаемым, и у меня есть вопросы: может ли такая функциональность измениться в будущем? Это желаемое поведение или особенность реализации разных браузеров?

Интересная штука с веб-компонентами! А что если создать свой класс с таким же поведением? Через замыкания или приватные поля можно блокировать конструктор, пока не выполнится условие. Пробовал такое или только со встроенными элементами возился?

Да, с обычными классами тоже можно такое провернуть. Недавно играл с Symbol.hasInstance и приватными полями - получилось заблокировать создание экземпляров до нужного момента. У тебя это не баг, а фишка Custom Elements. Браузер проверяет регистрацию элемента перед запуском конструктора. Так он гарантирует нормальную работу DOM API и lifecycle методов.

Дело в том, что браузерные API работают по особым правилам. HTMLVideoElement и другие встроенные элементы защищены от прямого создания. Но когда регистрируешь кастомный элемент через customElements.define, браузер сам становится посредником и позволяет создавать экземпляры. Это документированное поведение Web Components API, так что вряд ли изменится. Без регистрации браузер не понимает, что твой класс - валидный кастомный элемент.