Javascript Prototype.js&;document.createElement()
全部 我现在正在学习prototype.js。有些东西看起来很奇怪。例如,下面是我在firebug中运行的代码片段,url是,因为页面中有prototype.jsJavascript Prototype.js&;document.createElement(),javascript,prototypejs,Javascript,Prototypejs,全部 我现在正在学习prototype.js。有些东西看起来很奇怪。例如,下面是我在firebug中运行的代码片段,url是,因为页面中有prototype.js var el2 = document.createElement('div'); var k=0; for(var i in el2){ k++}; console.log(k); 结果是262,这很奇怪。因为如果我在没有prototype.js的页面中运行相同的代码,结果是195。我的问题是prototype.js如何影响docu
var el2 = document.createElement('div');
var k=0;
for(var i in el2){ k++};
console.log(k);
结果是262,这很奇怪。因为如果我在没有prototype.js的页面中运行相同的代码,结果是195。我的问题是prototype.js如何影响document.createElement方法。我在prototype.js中查询document.createElement,找不到类似document.createElement=function(){}这样的代码
谢谢 Prototype影响
HtmleElement
的原型,该原型由document.createElement
创建,因此得名
本机扩展
这一切背后有一个秘密
在支持向本机对象原型添加方法的浏览器中
例如HTMLElement
元素上的所有DOM扩展都可以通过
默认值,无需调用元素.extend()
,美元函数
或者别的什么
document.createElement
正在创建一个由prototype.js扩展的HTMLElement
。有关更多信息,请参阅。根据您发布的代码,您正在循环元素对象并计算该元素对象上的属性数
正如其他海报所指出的,PrototypeJS为HtmleElement的本机Javascript定义添加了额外的方法和属性
请看一下元素名称空间,它列出了PrototypeJS添加的所有方法和属性
编辑更多信息
PrototypeJS如何向元素添加新方法
首先,您需要了解javascript原型是如何工作的——最简单的定义是它是用于构建对象的蓝图,当创建该类型的新对象时,该对象具有该蓝图中定义的所有方法以及原型链上的任何其他方法
原型链的最简单示例
DIVElement -> HTMLElement -> Object
因此,一个新的div元素获得了DIVElement原型、HTMLElement原型和对象原型的所有方法
这也是为什么不建议扩展对象原型的原因,因为所有内容都是从该原型复制的
因此,PrototypeJS使用在大多数浏览器中本机不存在的新方法扩展了HTMLElement.prototype
对象,因此每当在javascript中创建新的HTML元素时,它都会获得PrototypeJS方法的副本
查找源代码中的特定位置
Object.extend(GLOBAL.Element, {
extend: extend,
addMethods: addMethods
});
这是许多功能检测的结尾,以查看浏览器支持哪些元素等。谢谢大家,我想我知道protytype.js如何进行本机扩展
(function(div) {
if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) {
window.HTMLElement = { };
window.HTMLElement.prototype = div['__proto__'];
Prototype.BrowserFeatures.ElementExtensions = true;
}
div = null;})(document.createElement('div'));
我认为这是进行本机扩展的代码片段。Yew,我看到了,但我的问题是prototype.js在哪里进行本机扩展。因为如果没有替换或更改createElement方法,也没有替换或更改HtmleElement对象,则无法获得新的不同HtmleElementobject@user2155362:Prototype已更改
HTMLElement
对象。prototype是如何更改HtmleElement对象的,我指的是prototype中的哪一行。js@user2155362:你想让我链接到源代码吗?嗨,根据api文档,我知道prototypejs做本机扩展。这是api文档告诉我们的结论。我只是想知道prototypejs是如何做到的。如前所述,我在protytype.js中找不到任何替换或修改HtmleElement对象的代码。如果我使用方法$,我肯定会得到一个新元素对象,因为$中的code element.extend(element)确保该方法将返回一个新元素extend by prototype。但是createElement方法呢?为什么我们可以通过raw document.createElement方法获得新的扩展元素?谢谢Geek Num 88,你给了我很多灵感