Можно ли изменить класс пользовательского элемента/веб-компонента после его регистрации? Это не то, что я обычно (или когда-либо) хочу делать в рабочем коде, но при создании прототипа или реализации инструмента исправления кода для разработки это было бы полезно. Вот что я пробовал, безуспешно, до сих пор:
document.body.appendChild(document.createElement('foo-bar')) // empty element
class FooBar extends HTMLElement {
connectedCallback () {
this.textContent = 'foo bar'
}
}
customElements.define('foo-bar', FooBar) // element shows "foo bar"
FooBar.protoype.connectedCallback = function () {
this.textContent = 'foo bar 2'
}
document.body.appendChild(document.createElement('foo-bar')) // element shows "foo bar", not "foo bar 2"
customElements.get('foo-bar').protoype.connectedCallback = function () {
this.textContent = 'foo bar 2'
}
document.body.appendChild(document.createElement('foo-bar')) // element shows "foo bar", not "foo bar 2"
class FooBar2 extends HTMLElement {
connectedCallback () {
this.textContent = 'foo bar 2'
}
}
customElements.define('foo-bar', FooBar2) // Exception thrown, 'foo-bar' already defined
Подводя итог, можно сказать, что изменение класса, первоначально переданного в CustomElementsRegistry, не имеет никакого эффекта. Назначение прототипу того, что находится в реестре, не имеет никакого эффекта. Попытка присвоить новый класс элементу в реестре невозможна, так как возникает исключение. Все эти три варианта поведения противоречат моему опыту почти со всеми аспектами любого другого JavaScript API. Крайне необычно, к лучшему или к худшему, невозможность что-то видоизменить, если оно не настроено как ненастраиваемое. Однако, когда я проверяю, настраиваются ли объекты, среда выполнения говорит, что да!
Кто-нибудь знает способ изменить/дополнить определение пользовательского элемента после его определения?
customElements.define
получает ссылку на различные функции-члены предоставленного класса, и попытка переопределить их у меня не сработала. - person Intervalia   schedule 19.12.2017