Javascript jQuery对象如何模拟数组?

Javascript jQuery对象如何模拟数组?,javascript,jquery,Javascript,Jquery,jQuery对象的行为类似于数组,不会污染本机原型。 这是如何实现的 我知道这不仅仅是带有数字键的对象,所以可能只是提供相应方法的问题(类似于jQuery.prototype.indexOf=Array.prototype.indexOf) 我在谷歌上搜索并查看了源代码,但找不到确切的答案。查看jquery代码(开发),第139行: // Force the current matched set of elements to become // the specified array of e

jQuery对象的行为类似于数组,不会污染本机原型。 这是如何实现的

我知道这不仅仅是带有数字键的对象,所以可能只是提供相应方法的问题(类似于
jQuery.prototype.indexOf=Array.prototype.indexOf

我在谷歌上搜索并查看了源代码,但找不到确切的答案。

查看jquery代码(开发),第139行:

// Force the current matched set of elements to become
// the specified array of elements (destroying the stack in the process)
// You should use pushStack() in order to do this, but maintain the stack
setArray: function( elems ) {
    // Resetting the length to 0, then using the native Array push
    // is a super-fast way to populate an object with array-like properties
    this.length = 0;
    Array.prototype.push.apply( this, elems );
        return this;
},

这是因为jquery查询的任何结果都是数组。

尽管jquery对象的行为类似于数组,但它们实际上只是类似于数组的对象。类似数组的对象是使用数字键的对象,具有
length
属性,这是与

因为jQuery对象只是类似于数组的对象,而不是实际的
array
对象,所以不能直接调用本机数组操作(like或)。您可以使用
Array.prototype
,也可以扩展jQuery的功能

$('div').reverse(); // TypeError: $("div").reverse is not a function

// we can use Array.prototype though
Array.prototype.reverse.apply($('div'));

// or we can extend jQuery very easily
$.fn.reverse = Array.prototype.reverse;
$('div').reverse(); // now it works!
您的假设是正确的,Firebug不包括任何用于格式化jQuery对象的特殊大小写。快速搜索会显示Firebug邮件列表。假设信息仍然正确(帖子从1月份开始),Firebug将把一个对象格式化为数组,如果它有有限长度和
拼接方法


JQuery满足这两个条件,但只不过是本机
数组
方法的直接副本。它没有文档记录,这意味着它要么仅供内部使用,要么只是为了诱使Firebug巧妙地格式化jQuery对象而添加的。

是什么让你相信它不仅仅是带有数字键的对象?首先,Firebug将jQuery对象显示为数组,但不是这样的手动创建的对象——我怀疑它对jQuery有特殊的处理。谢谢。我也看到了这一点,但似乎还不够:var MyObj=function(args){this.length=0;Array.prototype.push.apply(this,arguments);返回this;};var obj=新的MyObj(“你好”,“世界”);不要从构造函数返回
这个
!另外,
var
设置变量,但不返回值;如果您是在类似Firebug的工具中执行该代码段:
var MyObj=function(args){this.length=0;Array.prototype.push.apply(this,arguments);};obj=新MyObj(“你好”,“世界”)我很困惑:如果不是构造函数,“this”就不是对象(只是窗口!)!?你能提供一个工作示例吗?
MyObj
是一个构造函数,这就是重点!这是一个有效的例子:)对不起,我误读了你先前的陈述。然而,您在那里的代码似乎对我不起作用:obj.indexOf是未定义的——而且,obj在Firebug中没有显示为数组。我错过什么了吗?太棒了-谢谢!我不太愿意添加拼接方法,只是为了让它在Firebug中看起来更漂亮,但这只是一个小细节。(注:你的帖子有一个拼写错误,你提到的是“切片”而不是“拼接”。)谢谢-更正。我只建议将
splice
方法添加到jQuery中,专门用于Firebug,因为jQuery的1.2分支没有公开这种方法。事实上,我确实记得有一段很短的时间,我的jQuery对象在Firebug中没有被格式化为
数组。当然,1.3中介绍的方法可能只是巧合。谢谢——这是一个很有趣的机会。我注意到Safari的web检查器似乎使用了相同的标准——
length
对象和
splice
方法——将对象格式化为数组:
var o;o={length:2,splice:function(x){}=>
[]
(firebug严格打印:
[未定义,未定义]
)。