Document.createElement arity

时间:2016-04-15 17:58:24

标签: javascript dom

这与this问题有关但不完全相同。我最近有一些代码在几个浏览器上破解了,因为它将document.createElement包装了一个装饰器,用于调整内置函数。

打开chrome控制台并在FF / Safari中键入document.createElement.length会产生1,

为什么呢?它是另一个问题中提到的可选类型扩展(奇怪的是,对于webcomponents'自定义元素,这是一个chrom(ium)的东西)?标准对此有何看法?

更新

确实(至少在FF中)与typeExtension相关,控制台中的document.createElement.toString()返回

function createElement(tag, typeExtension) {
    if (tag) {
      tag = tag.toLowerCase();
    }
    if (typeExtension) {
      typeExtension = typeExtension.toLowerCase();
    }
    var definition = getRegisteredDefinition(typeExtension || tag);
    if (definition) {
      if (tag == definition.tag && typeExtension == definition.is) {
        return new definition.ctor();
      }
      if (!typeExtension && !definition.is) {
        return new definition.ctor();
      }
    }
    var element;
    if (typeExtension) {
      element = createElement(tag);
      element.setAttribute("is", typeExtension);
      return element;
    }
    element = domCreateElement(tag);
    if (tag.indexOf("-") >= 0) {
      implementPrototype(element, HTMLElement);
    }
    return element;
  }

##更新2 github issue - 请看Jeremy的答案。

1 个答案:

答案 0 :(得分:0)

您引用的源代码is from the Polymer team's Web Components polyfill,而不是本机浏览器实现。如果你在不包含polyfill的页面中尝试它,你会得到不同的结果(Ubuntu上的Firefox):

> document.createElement.length
1

> document.createElement.toString()
"function createElement() {
    [native code]
}"

您在Chrome中获得1的原因是因为它目前包含Web组件的原生实现(其中.length仍为1),因此未使用polyfill。

在任何浏览器中,内置函数的.length都不是2。但是,createElement的规范很快就会发生变化,所以不要依赖于这一点。