Re: [w3c/webcomponents] Non-class based example of customElement.define() (#587)

To make `HTMLELement` subclasses compatible with plain ES5-style constructors that call their super constructor with `.apply()` or `.call()`, the HTML engine should allow this:

```js
function MyEl(...args) {
    const el = Reflect.construct(HTMLElement, args, new.target)
    el.__proto__ = this.__proto__
    this.__proto__ = el

    // test:
    this.connectedCallback() // connected!
    console.log( this instanceof HTMLElement ) // true
}
MyEl.prototype = {
    __proto__: HTMLElement.prototype,
    constructor: MyEl,

    connectedCallback() {
        console.log(' ----- connected!')
    },
}
MyEl.__proto__ = HTMLElement

customElements.define('my-el', MyEl)
const el = document.createElement('my-el')
document.body.appendChild( el )
```

But the engine gives this error:

```
Uncaught TypeError: Failed to construct 'CustomElement': The result must implement HTMLElement interface
```

But everything about the instance created from the `MyEl` constructor implements the interface! There's not a good reason it shouldn't work. The engine _could_ call `connectedCallback` if it just looks for the method which is there.

Why exactly can't we be allowed to do things like this?

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/587#issuecomment-378678252

Received on Wednesday, 4 April 2018 17:21:11 UTC