这将返回一个 jQuery 对象。什么是 jQuery 对象。它是一个对象、一个数组还是两者的某种组合?
$("#id")
我在这里寻找源代码,但找不到它。
首先,它不是什么。
jQuery 对象不是数组。
在 JavaScript 中,有内置的原生构造函数。其中之一是Array
。但最终Array
构造函数会创建对象。jQuery 对象不是从 Array 构造函数构建的。
那么 Object 与 Array 有什么不同呢?
由于Object
和Array
是内置的本机构造函数,因此从构造函数创建的对象具有内部[[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 的行为不同。
$()
返回 jQuery 类 ( new jQuery()
) 的实例。
因此它继承了所有标准 jQuery 方法,以及所有插件,来自jQuery.prototype
(别名为jQuery.fn
)
此外,构造函数通过添加属性以及集合中每个元素的索引属性,jQuery()
将每个实例转换为类似数组的对象。length
返回的对象(请参阅EcmaScript §4.2.1了解这意味着什么)是 jQuery 内部构造函数的一个实例(jQuery.fn.init
- 有关 jQuery 实例化模式的详细信息,请参阅此答案),继承自$.fn
原型对象。
当然,它是Object
JavaScript 中几乎所有对象的一个实例。
而且,因为每个 jQuery 元素都代表一个 [DOM] 元素的集合,所以它看起来像一个Array
带有数字索引属性的 —— 尽管该length
属性不会自动自我更新,但您可以在其上应用大多数 Array 方法。它不是一个真实的Array
实例(什么是数组,什么是 JS?)。
jquery 对象是 jquery 库的一个对象,基本上所有的 jquery 方法和属性都附加到该 jquery 对象上,您不能将其用作普通的 javascript 对象。它也与它是哪个 jquery 对象不同。