Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Prototype.js&;document.createElement()_Javascript_Prototypejs - Fatal编程技术网

Javascript Prototype.js&;document.createElement()

Javascript 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

全部 我现在正在学习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如何影响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,你给了我很多灵感