したがって、カスタム要素を使用する私が作成しているライブラリでは、CustomElementsRegistry
インスタンス化する前にクラスを定義する必要があることは明らかです。
現在、これはデコレータで解決されています。
class Component extends HTMLElement {
static register (componentName) {
return component => {
window.customElements.define(componentName, component);
return component;
}
}
}
@Component.register('my-element')
class MyElement extends Component { }
document.body.appendChild(new MyElement());
これは機能しますが、クラスのインスタンス化時にカスタム要素を自動的に登録したいと思います(作成者が作成するすべてのコンポーネントにデコレータを追加する必要がないように)。これは、Proxy
.
ただし、私の問題は、コンストラクターで Proxy を使用しようとして、ターゲットのインスタンスを返そうとするとIllegal Constructor
、要素がレジストリで定義されていないかのように、まだ取得されることです。
これは明らかに、プロキシ内でクラスをインスタンス化する方法に関係していますが、それ以外の方法はわかりません。私のコードは次のとおりです。
最新の Chrome で実行してください:
class Component extends HTMLElement {
static get componentName () {
return this.name.replace(/[A-Z]/g, char => `-${ char.toLowerCase() }`).substring(1);
}
}
const ProxiedComponent = new Proxy(Component, {
construct (target, args, extender) {
const { componentName } = extender;
if (!window.customElements.get(componentName)) {
window.customElements.define(componentName, extender);
}
return new target(); // culprit
}
});
class MyElement extends ProxiedComponent { }
document.body.appendChild(new MyElement());
例外MyElement
をスローしないようにクラスをインスタンス化しているという事実のコンテキストを失うことなく、プロキシ内で継承のチェーンを続行するにはどうすればよいですか?Illegal Constructor