就像$本身不仅仅是一个用户定义的对象(在它的基础上,它是一个函数,这就是为什么您可以在它上使用()操作符,并且它继承了来自Function.prototype的所有函数),所谓的jQuery对象的实际Javascript type是什么?
它必须是标准的类似数组的对象之一,因为您可以在上面使用[]运算符,这是您甚至不能在IE8中对字符串执行的操作(不,不能在对象String上这样做。你可以在字符串文字之前对它们进行装箱)。
因此,它也不是用户定义的对象(NB没有jQuery对象,它是用原始javascript编写的)。我有一种感觉,它是一个NodeList (或者在没有NodeList的浏览器中等效)。
您可能注意到这一点的一个原因是,您已经将方法添加到Array原型中,并且发现该函数不存在于jQuery找到的一组节点上!
那么,是否有人与jQuery亲密到足以与我分享这个较低层次的信息呢?或者,在Javascript中有一个简短的、详尽的类似数组的对象列表,我可以用它来测试jQuery对象,直到我发现它是我自己?
我问这个问题的原因不是假设jQuery只是向对象添加元素,而是使用索引作为属性名(即obj[0] = x;),这是因为Chrome工具和Firebug如何显示它们。

这显示了显示数组、jQuery和类似数组的对象的开发工具,并且至少在jQuery所做的事情背后有一些魔力。
编辑
这不是NodeList。如果有帮助的话;在Chrome中检查它会发现它是jQuery.fn.jQuery.init[0]类型的,__proto__将自己描述为Object[0] (它拥有所有的jquery方法)。任何解释jQuery正在做什么和如何做的人都会受到极大的感谢。我现在来看一下jQuery的源代码。
至于图像,它不仅仅是一个覆盖的.toString()。
$('').toString == Object.prototype.toString //true
$('').toString == Array.prototype.toString //false发布于 2013-09-06 01:44:03
什么是jQuery对象?
$()或jQuery()函数返回jQuery对象。它不是一个Array,也不是一个NodeList,也不是从其中任何一个派生出来的。它是一个由Object构造函数(实际上是jQuery.fn.init()函数)创建的jQuery.fn.init()。这个对象非常类似于用Object创建的任何其他new SomeConstructor(),甚至是普通的对象文本。
当您调用$()或jQuery()而没有new运算符时,它是为了你
jQuery = function( selector, context ) {
// The jQuery object is actually just the init
// constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},jQuery对象在某种程度上“类似数组”,因为它具有带有数字索引和.length属性的属性,但这些只是直接在jQuery代码中的对象中设置的属性。它还具有来自其原型的许多属性和方法,即jQuery.fn或jQuery.prototype (jQuery.fn只是对jQuery.prototype的引用;它们是同一个对象)。
您可以在$(element)中看到这方面的示例。
// HANDLE: $(DOMElement)
} else if ( selector.nodeType ) {
this.context = this[0] = selector;
this.length = 1;
return this;
} ...在这段代码中,selector实际上是一个DOM元素,代码将该元素存储在this[0]中,并将this.length设置为1。这就是为什么您可以使用[0]和.length,因为对象具有显式设置的这些属性。
为什么jQuery对象会像数组一样显示?
这里涉及到一些魔法,但神奇之处在于Firebug和Chrome开发工具。它们都在寻找两个特定的属性来决定显示一个对象,就好像它是一个数组一样:
length属性,它要么是数字,要么是包含数字的字符串。splice属性,它是一个函数。如果对象同时具有这些属性,则显示为数组。
您可以通过将以下行粘贴到Chrome DevTools或Firebug中进行测试:
({ splice:function(){}, length:0 })Chrome显示器:
[]萤火虫显示:
Object[ ]删除任何一个属性,它将显示为一个对象。
这些属性是否位于对象本身或其原型中并不重要。您可以将此代码粘贴到任一控制台中,它将显示与上面代码相同的类似数组的表示法:
function A(){}; A.prototype = { splice:function(){}, length:0 }; new A;您可以向“数组”添加一个元素:
({ splice:function(){}, length:1, 0:'test' })现在Chrome显示:
["test"]和Firebug显示:
Object[ "test" ]请注意,Firebug显示与它为实际Array显示的内容不完全相同。Firebug将这个Object前缀放在类似数组的显示器前面,以让您知道它不是实际的Array。
它也在jQuery对象上这样做。如果你进入:
$(document.body)萤火虫显示:
Object[ body ]您可以单击单词Object来获得jQuery对象的完整对象样式显示,而不是类似数组的显示。
Chrome没有区分这一点;它以相同的方式显示Array或类似数组的Object。
这就是魔法。它在jQuery中没有什么特别之处,只是它返回的对象确实具有length和splice属性。splice()方法位于prototype上,length属性可能来自prototype (对于空的“数组”),或者更经常来自jQuery对象本身。
这两个属性触发了真正的魔力: DevTools和Firebug中的黑客试图为这样的对象提供更有用的显示。
吹嘘权:-)
一些历史上的琐事:我实际上负责jQuery架构的这一部分。2006年初,jQuery的第一个版本并不是这样工作的。jQuery对象没有.length和[0]、[1]等属性。相反,它有自己的“私有”数组,您必须使用.get(n)从该数组中获取值。
我认为使用类似数组的直接访问元素会更方便,并提出了设置.length、[0]、[1]等属性的想法,这样就可以像只读数组一样工作。
发布于 2013-09-06 01:00:43
我的理解是Array的一个子类,它继承自Array类,并有自己的方法
以上变动:
它不是数组的子类。但是它是由数组生成的,但是在数组对象创建后,jQuery用自己的原型jQuery修改了对象原型,最终成为类似于数组的jQuery对象。
https://stackoverflow.com/questions/18648218
复制相似问题