4

这将返回一个 jQuery 对象。什么是 jQuery 对象。它是一个对象、一个数组还是两者的某种组合?

$("#id")

我在这里寻找源代码,但找不到它。

4

4 回答 4

16

首先,它不是什么。

jQuery 对象不是数组。

在 JavaScript 中,有内置的原生构造函数。其中之一是Array。但最终Array构造函数会创建对象。jQuery 对象不是从 Array 构造函数构建的。


那么 Object 与 Array 有什么不同呢?

由于ObjectArray是内置的本机构造函数,因此从构造函数创建的对象具有内部[[Class]]属性。你可以像这样看到它的价值。

Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call([]); // [object Array]

所以你可以看到这些对象有区别。


还有哪些不同之处?

两个对象的原型链是不同的。对于一个普通的对象,它可以像这样可视化。

{} ---> Object.prototype ---> null

而对于一个数组,像这样。

[] ---> Array.prototype ---> Object.prototype ---> null

因此,您可以看到它们的继承也将它们区分开来。


那么jQuery对象呢?

jQuery 对象更像是一个普通的对象,而不是一个数组。但是 JavaScript 允许您定义自定义(非内置)构造函数。

toString值将与 Object 相同,[object Object]但原型链将不同。

function Foo() {

}

new Foo() ---> Foo.prototype ---> Object.prototype ---> null

所以 jQuery 的原型链将与此类似,但使用jQuery构造函数而不是Foo.


那么,这意味着什么?

JavaScript 中的所有对象都相似,因为它们都继承自Object.prototype*,但是您可以拥有具有扩展原型链的不同对象,也可以拥有具有内部[[Class]]属性的本地对象,从而使它们与众不同。

所以要回答“什么类型的对象是jQuery对象”的问题,答案是它是一个Object.prototype像每个对象一样继承自的对象,但也继承自prototype其自定义构造函数的。

* 请注意,在 ES5 中,您也可以拥有一个没有原型链的对象。它的链立即以 终止null


但是 jQuery 对象在数字索引处存储 DOM 元素,并且有一个.length属性。这不是使它成为一个数组吗?

不,这只是使它成为具有数字属性和名为length.

var myObj = {};
myObj[0] = "foo";
myObj[1] = "bar";

数组的属性并不特殊。它们对象的属性相同。

var myArr = [];
myArr[0] = "foo";
myArr[1] = "bar";

这两个代码示例正在做完全相同的事情。


他们在做同样的事情?真的吗?

差不多吧。Array 对象和 Object 对象之间的属性本身没有什么不同,但是 Array 有一些特殊的行为。

例如,如果我在比当前.length帐户更高的索引处添加属性,.length则会自动调整。

myArr.length; // 2
myArr[9] = "baz";
myArr.length; // 10

在一个阵列上,.length它本身具有一些“魔法”能力,比如能够通过设置.length一个较低的值来截断阵列。

myArr.length = 1;
myArr[1]; // undefined

因此,虽然 jQuery 对象具有数字属性和.length属性,但它的行为与原生 Array 的行为不同。

于 2012-09-24T18:39:24.400 回答
12

$()返回 jQuery 类 ( new jQuery()) 的实例。
因此它继承了所有标准 jQuery 方法,以及所有插件,来自jQuery.prototype(别名为jQuery.fn

此外,构造函数通过添加属性以及集合中每个元素的索引属性,jQuery()将每个实例转换为类似数组的对象。length

于 2012-09-24T18:26:12.520 回答
4

返回的对象(请参阅EcmaScript §4.2.1了解这意味着什么)是 jQuery 内部构造函数的一个实例(jQuery.fn.init- 有关 jQuery 实例化模式的详细信息,请参阅此答案),继承自$.fn原型对象。

当然,它是ObjectJavaScript 中几乎所有对象的一个​​实例。

而且,因为每个 jQuery 元素都代表一个 [DOM] 元素的集合,所以它看起来像一个Array带有数字索引属性的 —— 尽管该length属性不会自动自我更新,但您可以在其上应用大多数 Array 方法。它不是一个真实的Array实例(什么是数组什么是 JS?)。

于 2012-09-24T18:27:11.837 回答
2

jquery 对象是 jquery 库的一个对象,基本上所有的 jquery 方法和属性都附加到该 jquery 对象上,您不能将其用作普通的 javascript 对象。它也与它是哪个 jquery 对象不同。

于 2012-09-24T18:26:48.693 回答