Was ist der Sinn der Is-Syntax beim Erweitern von Elementen in Webkomponenten?

Um ein Element in Webkomponenten zu registrieren, geben Sie einfach Folgendes ein:

var XFoo = document.registerElement('x-foo', {
  prototype: Object.create(HTMLElement.prototype)
});

Um ein Element zu erstellen, können Sie einen der folgenden Schritte ausführen:

<x-foo></x-foo>

var xFoo = new XFoo();
document.body.appendChild(xFoo);

var xFoo = document.createElement( 'x-foo')
document.body.appendChild(xFoo);

Das ist alles in Ordnung und gut. Die Probleme beginnen, wenn Sie über das Erweitern vorhandener Elemente sprechen.

var XFooButton = document.registerElement('x-foo-button', {
  prototype: Object.create(HTMLButtonElement.prototype),
  extends: 'button'
});

Frage : Warum die Vervielfältigung? Hier,'button' sollte ausreichen (zumal es einfach genug ist, den Prototyp des Elements mit @ zu erarbeitObject.getPrototypeOf(document.createElement(tag));

Frage : Wie werden diese Informationen verwendetim Innere? Was passiert, wenn Sie zum Beispiel @ habprototype: Object.create(HTMLFormElement.prototype undextends: 'button' (wo was ist nachextends stimmt nicht mit dem übergebenen Prototyp überein)

Um eine zu erstellen, können Sie eine der folgenden Aktionen ausführen:

<button is="x-foo-button"></button>

var xFooButton = new XFooButton();
document.body.appendChild(xFoo);

var xFooButton = document.createElement('button', 'x-foo-button');
document.body.appendChild(xFooButton);

Frage : da es klar ist, dassx-foo-button erweitertbutton, warum müssen wir beide angeben, wenn wir @ verwenddocument.createElement()? Ich vermute, das liegt andocument.createElement() erstellt einfach ein Tag mit der Syntax<button is="x-foo-button"></button>, was mich zur nächsten Frage bringt:

Frage 4: Was ist der Sinn desis Syntax? Was ist der eigentliche Unterschied zwischen diesem Vorgehen:

var XFooButton = document.registerElement('x-foo-button', {
  prototype: Object.create(HTMLButtonElement.prototype),
  extends: 'button'
});

Und das

var XFooButton = document.registerElement('x-foo-button', {
  prototype: Object.create(HTMLButtonElement.prototype),
});

Anderes als 1) Die erste Syntax benötigt<button is="x-foo-button"></button>, um eine Instanz im Dokument zu erstellen. 2) Die zweite Syntax kann für @ verwendet werdeirgendei Element, nicht nur eine Erweiterung der benutzerdefinierten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage