document.registerElement - 为什么我们需要同时指定'prototype'和'extends'?

gip*_*ouf 4 javascript html5 web-component custom-element

考虑我想扩展native button元素,并创建自己的super-button元素.据我所知,它必须遵循以下模式:

var SuperButton = document.registerElement('super-button', {
  prototype: Object.create(HTMLButtonElement.prototype),
  extends: 'button'
});
Run Code Online (Sandbox Code Playgroud)

它看起来很奇怪 - 不是prototypeextends参数说同样的事情吗?如果我明确地说我super-button使用HTMLButtonElement原型,为什么我还需要指定它扩展了按钮元素?这不是多余的吗?对我来说,它看起来完全相同的信息.

Pau*_*aul 5

来自自定义元素规范:

通常,扩展元素的名称不能简单地通过查看它扩展的元素接口来确定,因为许多元素共享相同的接口(例如q和blockquote都共享HTMLQuoteElement).

换句话说,虽然<button>元素可能是多余的,但一般来说并不多余,规范需要支持一般情况.

我认为它甚至不是多余的<button>,因为没有什么可以阻止你这样做:

var SuperButton = document.registerElement('super-button', {
  prototype: Object.create(HTMLButtonElement.prototype),
  extends: 'a'
});
Run Code Online (Sandbox Code Playgroud)

  • 好吧,据我所知,'extends'部分是关于继承元素的样式和内部DOM,而'prototype'是关于功能的.我对吗?否则,我不明白扩展按钮的原型意味着什么,同时也是一个'a'元素.这很令人困惑:-). (3认同)