【发布时间】:2014-01-12 16:50:22
【问题描述】:
我一直认为 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
我的问题是:这个东西是如何被创造出来的?
所以如果你们能解释一下并提供一些代码示例,我将非常感谢你们。
【问题讨论】:
-
这是一个函数和一个对象和同时魔法,但绝不是一个数组!
-
您可以随时浏览 jQuery 源代码。这有点曲折和令人困惑,但很有教育意义。
-
仅供参考,ECMAScript specification 明确定义了大多数数组方法来处理 类数组 对象,for example:“
push函数是有意通用的; 它不要求它的this值是一个Array 对象。因此它可以转移到其他类型的对象中作为方法使用。push 功能是否可以成功应用于宿主对象取决于实现。
标签: javascript jquery arrays prototype