jQuery解构| ES 5术语中的JQuery对象?
这将返回一个jQuery对象。 什么是jQuery对象。 它是一个对象,一个数组,还是两者的某种组合?
$("#id")
我在这里查看源代码 ,但找不到它。
首先,它不是。
jQuery对象不是Array。
在JavaScript中,有内置的本机构造函数。 其中之一是Array
。 但最终Array
构造函数创建了Objects。 jQuery对象不是从Array构造函数构建的。
那么一个Object与一个数组有什么不同呢?
由于Object
和Array
是内置的本机构造函数,因此从构造函数创建的对象具有内部[[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对象不同。