javascript - jQuery 对象如何表现得像一个数组,即使它不是一个数组?

标签 javascript jquery arrays prototype

<分区>

我一直认为 jQuery $ 函数会返回一个附加了 jQuery 方法的数组。 我想提供一些例子:

假设我们有一个数组

var arr = [1,2,3];

然后我们可以添加我们自己的属性:

arr.someProp = 10;
arr.someMethod = function() { ... }

之后 arr 仍然是一个数组,尽管有自定义属性:

arr instanceof Array;   //true

所以,在最近的实验之前,我认为 jQuery 对象类似于 arr(但更复杂)。 我只是运行这段代码:

$('div') instanceof Array;  //false (!!!)

但它的行为就像一个数组。它有 push 方法,length 属性,即使在这种情况下也能正常工作:

var $jq = $('div');
$jq.length; //3
$jq.push(123);  //wrong code, I know, this is just for test
$jq.length      //4

此外,如果您执行 console.log($('div')),它会输出如下内容:

[<div></div>, <div></div>, <div></div>]

除了 jQuery 对象还有一些等同于 Array.prototype 方法的方法:

$('div').sort === Array.prototype.sort;     //true
$('div').splice === Array.prototype.splice; //true

我的问题是:这个东西是如何创建的?

所以如果你们向我解释一下并提供一些代码示例,我将非常感谢你们。

最佳答案

So, I thought jQuery object is something like arr (but more complicated) until recent experiment. I just run this code:

$('div') instanceof Array;  //false (!!!)

But it behaves like an array. It has push method, length property, that works correctly...

任何可变对象都可以“表现”得像一个数组,因为内置的 Array 方法将对其起作用,只要它具有适当的 .length 属性和预期的数字索引.

拿这个对象:

var obj = {
    "3": "buz",
    "0": "foo",
    "2": "baz",
    "1": "bar",
    length: 4
}

它不是数组,但我们可以将 Array.prototype.push 方法放在对象上,它会正常工作。

obj.push = Array.prototype.push;

obj.push("hi");

现在 obj.length5,并将包含 "hi" 字符串.

关于javascript - jQuery 对象如何表现得像一个数组,即使它不是一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21077408/

相关文章:

javascript - 将 JSON 对象转换为 JS 键/值对数组

javascript - 最喜欢的图标与 Iframe 冲突 - 这是怎么回事?

javascript - 如何在Bootstrap中实现这种滚动效果?

Javascript - 为什么这段代码会阻塞?

javascript - jQuery 分页转到输入值更改的页面

C 语言 -> 将段落中的单词分开

javascript - JSLint 提示数学运算符 "++"语法

javascript - Bootstrap 将 div 元素固定在顶部并防止调整大小

jquery - jquery Selectbox获取所有选项值

oracle - 如何在oracle中创建一个接受参数数组的存储过程