这与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的答案。
答案 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
的规范很快就会发生变化,所以不要依赖于这一点。