为什么push方法能在jQuery对象上使用?

4
var test = $();
test.push( $('div')[0] );

这个代码可以正常工作,有什么原因吗? 由于 push 是一个数组方法,我不明白为什么在这种情况下能够正常工作,您有什么想法吗?

使用 .add() 也可以实现相同的效果,那么它是否有实际用途呢?


something是任意的JavaScript对象吗?结果是什么? - BoltClock
@BoltClock 我已经编辑了我的问题。jQuery选择器会扩展带有div的内容。 - meo
2个回答

3
他们从Array.prototype中借用了.push()。

https://github.com/jquery/jquery/blob/1.6.2/src/core.js#L70

并且

https://github.com/jquery/jquery/blob/1.6.2/src/core.js#L296

例子:http://jsfiddle.net/HgS2R/1/

var MyObj = function(){};
MyObj.prototype.push = Array.prototype.push;

var inst = new MyObj;

inst.push( "test" );

document.write( inst[ 0 ] + '<br>' + inst.length );  // test, 1

请注意,您自定义构造函数的实例与实际的数组行为不完全相同。


编辑:

关于您问题中的编辑,.push() 不等同于 .add()

.push() 方法是将 DOM 元素添加到现有的 jQuery 对象中。

.add() 方法可以接受一个 DOM 元素或另一个具有 1 个或多个 DOM 元素的 jQuery 对象,并返回一个新的 jQuery 对象,其中包含新添加的元素。

它更像是一个 .concat() 方法。


1
我检查了源代码并找到了这些代码块(带有注释)。不确定它们是否回答了你的问题:
// Save a reference to some core methods
toString = Object.prototype.toString,
hasOwn = Object.prototype.hasOwnProperty,
push = Array.prototype.push,
slice = Array.prototype.slice,
trim = String.prototype.trim,
indexOf = Array.prototype.indexOf,

// For internal use only.
// Behaves like an Array's method, not like a jQuery method.
push: push,
sort: [].sort,
splice: [].splice

是的,它有所帮助,谢谢你。但我仍然不明白他们为什么这样做。 - meo
1
@meo:这是一个免费的方法。他们想要在一组索引属性的末尾添加一个项目,同时更新.length,这就是.push()所做的。不需要编写自己的方法。 - user113716

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接