jQuery解构| ES 5术语中的JQuery对象?

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

$("#id") 

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

首先,它不是。

jQuery对象不是Array。

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


那么一个Object与一个数组有什么不同呢?

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

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

所以你可以看到这些对象具有差异性。


还有什么其他差异?

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

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

而对于数组,就像这样。

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

所以你可以看到他们的inheritance也区分了它们。


那么jQuery对象呢?

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

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

 function Foo() { } new Foo() ---> Foo.prototype ---> Object.prototype ---> null 

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


那么,这意味着什么?

JavaScript中的所有对象都类似于它们从Object.prototype *inheritance,但是您可以拥有具有扩展原型链的不同对象,并且您还可以拥有具有内部[[Class]]属性的本机对象,以便区分它们。

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

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


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

不,这只是使它成为一个具有数字属性的对象,以及一个名为length的属性。

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

Array的属性并不特殊。 它们 Object的属性相同

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

这两个代码示例完全相同。


他们做的完全一样吗? 真?

好吧差不多。 Array对象和Object对象之间的属性本身没有区别,但Arrays有一些特殊的行为。

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

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

在一个数组上, .length本身具有一些“神奇”的能力,比如能够通过将.length设置为较低的值来截断数组。

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

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

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

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

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

当然,它是Object一个实例,几乎是JavaScript中的每个对象。

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

jquery对象是jquery库的一个对象,基本上所有jquery方法和属性都附加到你可以使用的jquery对象; t将它用作普通的javascript对象。 它也与jquery对象不同。