说我有以下标记:
<div></div>
<div></div>
<div></div>
我使用以下内容来检索它们:
var divs = $('div');
我如何能够使用[]
语法检索相应的DOM元素,也可以调用jQuery对象上的方法,例如{{1} }?
.first()
我问这个问题是因为我认为var div_one = divs[0];
是jQuery 对象,而不是真正的JavaScript divs
对象。
这是如何运作的?
答案 0 :(得分:8)
数字索引只是返回对象的属性。它与此类似:
var obj = {};
obj[0] = 'foo';
alert(obj[0]);
数组和伪数组对象几乎完全相同 - 唯一的区别是真实数组的length
属性由JavaScript引擎自动管理。
答案 1 :(得分:3)
您可以使用任何对象执行此操作。它与“阵列式”对象没有任何关系。
var myObj = {};
myObj[0] = 'some value';
alert( myObj[0] );
以下是创建类似Array的对象的示例:
示例: http://jsfiddle.net/8rgRM/
// create constructor
function MyObj(){}
// extend it with an Array method
MyObj.prototype.push = Array.prototype.push;
// create an instance
var inst = new MyObj;
// use the push method
inst.push( 'some value' );
// the instance automatically has a length property that was updated
alert( inst.length );
长度属性的行为与实际数组中的行为一样可能很诱人,但事实并非如此。
例如,使用数组,您可以length = 0
清除数组的内容,但它不能在上面的对象中工作。
在jQuery的源代码中,here is where Array.prototype.push被引用,here is where it is extended被引用到jQuery原型中。
答案 2 :(得分:2)
这会让事情变得清晰起来。试一试,然后玩吧。
//used to produce pure classical inheritance
function clone(obj){
function F(){};
F.prototype=obj;
return new F();
}
// Constructor function, used to instantiate a new object of myDivQuery Class
myDivQuery = function (){
var div_list = document.getElementsByTagName('div');
for (var i=0; i < div_list.length; i++){
this[i] = div_list[i];
}
this.length = div_list.length;
};
//myDivQuery inherits from Array class
myDivQuery.prototype = clone( new Array );
//add new methods to myDivQuery class, which is not added to the orginal Array class
myDivQuery.prototype.first = function (){
return this[0];
}
myDivQuery.prototype.last = function (){
return this[this.length - 1]
}
divs = new myDivQuery();
divs[0]; // first div on the page;
divs[1]; // the second div on the page ....
divs instanceof Array; //true
divs instanceof myDivQuery; //true
divs.first() === divs[0]; //true
divs.last(); //last div on page
Array.prototype.first; //undefined
divs.slice(1); //but still can use array methods
divs.reverse(); //another array method
这是你如何创建一个伪数组,一个巨大的评论是javascript中的数组不能被分类,即无法创建具有相同数组功能的子数组,主要原因是该行为的数组中的length属性,对JS程序员来说是隐藏的,但是有很多黑客和解决方法可以做到这一点,要了解更多信息,请阅读kangax这篇精彩的文章。 http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/
答案 3 :(得分:0)
在JavaScript中,您可以使用与array-index表示法相同的语法访问对象的属性:
var o = {'foo':'bar'},
fooVar = 'bar';
//these all alert 'bar'
alert(o.foo);
alert(o['foo']);
alert(o[fooVar]);
但是,您只能使用点表示法来表示有效名称。 o[0]
有效,但o.0
没有。
jQuery返回一个jQuery.init
对象,其中包含许多属性(即length
),以及dom elements
或选择器匹配的其他原始javascript对象的映射,列出从0
到n
。
答案 4 :(得分:0)
选择器的结果(开始帖子中的$("div")
)返回结果with the type Jquery
引用jquery页面:
jQuery对象本身表现很多 像一个数组;它有一个长度 财产和财产中的要素 对象可以通过他们的访问 数字索引[0]到[length-1]。 请注意,jQuery对象不是 实际上是一个Javascript Array对象,所以 它没有a的所有方法 true数组对象,例如join()。