Javascript jQuery解构| ES5术语中的jQuery对象?

Javascript jQuery解构| ES5术语中的jQuery对象?,javascript,jquery,Javascript,Jquery,这将返回一个jQuery对象。什么是jQuery对象。它是对象、数组还是两者的组合 $("#id") 我正在中查找,但找不到。$()返回jQuery类的实例(new jQuery())。 因此,它继承了jQuery.prototype(别名为jQuery.fn)中的所有标准jQuery方法以及所有插件 此外,jQuery()构造函数通过添加length属性以及集合中每个元素的索引属性,将每个实例转换为类似数组的对象。jQuery对象是jQuery库的对象,基本上所有jQuery方法和属性都可以

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

$("#id")
我正在中查找,但找不到。

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


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

jQuery对象是jQuery库的对象,基本上所有jQuery方法和属性都可以附加到该jQuery对象;不要将其用作普通javascript对象。返回的对象(请参见其含义)是jquery的内部构造函数函数的一个实例(
jquery.fn.init
——有关jquery实例化模式的详细信息,请参见),继承自
$.fn
原型对象

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

而且,由于每个jQuery元素都代表[DOM]元素的集合,因此它看起来像一个带有数字索引属性的
数组
——尽管
length
属性不是自动更新的,但您可以对其应用大多数数组方法。它不是一个真正的
数组
实例(,)。

首先,它不是什么。

jQuery对象不是数组

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


那么对象与数组有何不同呢?

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

Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call([]); // [object Array]
{} ---> Object.prototype ---> null
[] ---> Array.prototype ---> Object.prototype ---> null
所以你可以看到这些物体有一个区别


还有什么区别?

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

Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call([]); // [object Array]
{} ---> Object.prototype ---> null
[] ---> Array.prototype ---> Object.prototype ---> null
而对于数组,如下所示

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]
相同,但原型链将不同

function Foo() {

}

new Foo() ---> Foo.prototype ---> Object.prototype ---> null
因此jQuery的原型链与此类似,但是使用
jQuery
构造函数而不是
Foo


那么这一切意味着什么呢?

JavaScript中的所有对象都类似于继承自
Object.prototype
*,但您可以拥有具有扩展原型链的不同对象,也可以拥有具有内部
[[Class]]
属性的本机对象,这些属性赋予它们区别

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

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


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

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

var myObj = {};
myObj[0] = "foo";
myObj[1] = "bar";
数组的属性并不特殊。它们与对象的属性相同

var myArr = [];
myArr[0] = "foo";
myArr[1] = "bar";
这两个代码示例所做的事情完全相同


他们在做完全相同的事情?真的吗?

差不多了。数组对象和对象对象之间的属性本身没有区别,但数组有一些特殊的行为

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

myArr.length; // 2
myArr[9] = "baz";
myArr.length; // 10
在数组中,
.length
本身具有一些“神奇”的功能,例如可以通过将
.length
设置为较低的值来截断数组

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

因此,尽管jQuery对象具有数值属性和
.length
属性,但它的行为与本机数组的行为不同。

这是由选择器表示的元素。在Firefox中,使用
console.debug($(“#id”)。请参阅此SO链接。可能会有帮助@HiroProtation:类似数组的对象是一个常规对象,其属性使其看起来像数组,正如我在回答中所解释的那样。@dotsamuelswan:它不是数组。@HiroProtation:所说的“类”,是指原型函数。你有更好的术语吗?“它是一个对象,一个数组,还是两者的组合?”-一个如上所述的对象。很有趣为什么会有向下投票。依我看,答案简单而完整。@SLaks:请注意
jQuery.prototype
也只是一个别名:-)一个jQuery对象!-)JavaScript是松散类型的。因此,对象的“种类”是非物质的。任何提供您目前所需的实用程序的对象都是“正确的类型”。@hiroprogator它“看起来像一个数组”,但它不是数组。从数组继承是危险的,因此它从对象继承并实现类似数组的特性(例如,
.length
)——换句话说,它像数组一样嘎嘎作响。;-)@男主角:只有厕所