【发布时间】:2013-09-09 23:45:20
【问题描述】:
就像$ 本身不仅仅是一个用户定义的对象(它在其基础上是一个函数,这就是为什么您可以在其上使用() 运算符,它继承了Function.prototype 的所有函数) 所谓jQuery 对象的实际Javascript type 是什么?
它必须是标准的类数组对象之一,因为您可以在其上使用 [] 运算符,这在 IE8 中甚至不能对字符串执行(不,您不能,不是对象String。您可以在装箱之前对字符串文字进行处理)。
再说一遍,它不是用户定义的对象(注意没有jQuery 对象之类的东西,它是用原始javascript 编写的)。我感觉它是 NodeList(或在没有 NodeList 的浏览器中的等价物)。
您可能已经注意到这一点的一个原因是您向Array 原型添加了方法,但您发现该函数在 jQuery 找到的一组节点上不存在!
那么,有足够了解 jQuery 的人与我分享这些较低级别的信息吗?或者是否有一个简短的、详尽的 Javascript 中类似数组的对象列表,我可以测试 jQuery 对象,直到我发现它是我自己?
我之所以问这个问题,而不是假设 jQuery 只是向对象添加元素,而是使用索引作为属性名称(即obj[0] = x;),是因为 Chrome 开发工具和 Firebug 显示它们的方式。
@ 987654324@
这显示了显示数组、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
【问题讨论】:
-
这是一个函数。一旦你用它选择元素,返回的是一个类似数组的对象,因为它实际上只是一个对象,但它看起来很臭,感觉就像一个数组。这就是为什么它有一些数组方法,但不是全部。
-
[]运算符不是“方法”。你不能把它给任何你想要的东西;它不是具有一些数组方法的用户定义对象。 -
调用 jQuery 函数返回的对象只是普通对象。与任何对象一样,您可以使用括号表示法(即
obj[prop])访问它的属性。 jQuery 使用数字属性名称(实际上是字符串),添加了一个长度属性,如果我没记错的话,还添加了 splice。这足以创建一个类似数组的对象。 -
只是为了改善 SO 社区:这是你写问题的方式。
标签: javascript jquery object