首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery返回的对象的实际类型是什么?

jQuery返回的对象的实际类型是什么?
EN

Stack Overflow用户
提问于 2013-09-06 00:55:37
回答 2查看 1.2K关注 0票数 3

就像$本身不仅仅是一个用户定义的对象(在它的基础上,它是一个函数,这就是为什么您可以在它上使用()操作符,并且它继承了来自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()

代码语言:javascript
复制
$('').toString == Object.prototype.toString //true
$('').toString == Array.prototype.toString //false
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-06 01:44:03

什么是jQuery对象?

$()jQuery()函数返回jQuery对象。它不是一个Array,也不是一个NodeList,也不是从其中任何一个派生出来的。它是一个由Object构造函数(实际上是jQuery.fn.init()函数)创建的jQuery.fn.init()。这个对象非常类似于用Object创建的任何其他new SomeConstructor(),甚至是普通的对象文本。

当您调用$()jQuery()而没有new运算符时,它是为了你

代码语言:javascript
复制
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.fnjQuery.prototype (jQuery.fn只是对jQuery.prototype的引用;它们是同一个对象)。

您可以在$(element)中看到这方面的示例。

代码语言:javascript
复制
// 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开发工具。它们都在寻找两个特定的属性来决定显示一个对象,就好像它是一个数组一样:

  1. length属性,它要么是数字,要么是包含数字的字符串。
  2. splice属性,它是一个函数。

如果对象同时具有这些属性,则显示为数组。

您可以通过将以下行粘贴到Chrome DevTools或Firebug中进行测试:

代码语言:javascript
复制
({ splice:function(){}, length:0 })

Chrome显示器:

代码语言:javascript
复制
[]

萤火虫显示:

代码语言:javascript
复制
Object[ ]

删除任何一个属性,它将显示为一个对象。

这些属性是否位于对象本身或其原型中并不重要。您可以将此代码粘贴到任一控制台中,它将显示与上面代码相同的类似数组的表示法:

代码语言:javascript
复制
function A(){}; A.prototype = { splice:function(){}, length:0 }; new A;

您可以向“数组”添加一个元素:

代码语言:javascript
复制
({ splice:function(){}, length:1, 0:'test' })

现在Chrome显示:

代码语言:javascript
复制
["test"]

和Firebug显示:

代码语言:javascript
复制
Object[ "test" ]

请注意,Firebug显示与它为实际Array显示的内容不完全相同。Firebug将这个Object前缀放在类似数组的显示器前面,以让您知道它不是实际的Array

它也在jQuery对象上这样做。如果你进入:

代码语言:javascript
复制
$(document.body)

萤火虫显示:

代码语言:javascript
复制
Object[ body ]

您可以单击单词Object来获得jQuery对象的完整对象样式显示,而不是类似数组的显示。

Chrome没有区分这一点;它以相同的方式显示Array或类似数组的Object

这就是魔法。它在jQuery中没有什么特别之处,只是它返回的对象确实具有lengthsplice属性。splice()方法位于prototype上,length属性可能来自prototype (对于空的“数组”),或者更经常来自jQuery对象本身。

这两个属性触发了真正的魔力: DevTools和Firebug中的黑客试图为这样的对象提供更有用的显示。

吹嘘权:-)

一些历史上的琐事:我实际上负责jQuery架构的这一部分。2006年初,jQuery的第一个版本并不是这样工作的。jQuery对象没有.length[0][1]等属性。相反,它有自己的“私有”数组,您必须使用.get(n)从该数组中获取值。

我认为使用类似数组的直接访问元素会更方便,并提出了设置.length[0][1]等属性的想法,这样就可以像只读数组一样工作。

票数 7
EN

Stack Overflow用户

发布于 2013-09-06 01:00:43

我的理解是Array的一个子类,它继承自Array类,并有自己的方法

以上变动:

它不是数组的子类。但是它是由数组生成的,但是在数组对象创建后,jQuery用自己的原型jQuery修改了对象原型,最终成为类似于数组的jQuery对象。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18648218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档