我理解pushstack函数是如何工作的,我也理解如何将它用于我的插件(我猜这是它最常用的,仅供内部使用和end()正常运行和其他类似的方法)。
现在下面是pushstack的jquery源代码,看看:
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
// Return the newly-formed element set
return ret;
},
真正在该功能中发生了很多事情并且我得到了大部分内容,但是我有一个小问题,理解下面的代码行: -
ret.prevObject = this;
ret.context = this.context;
prevObject
和context
是什么?谁能给我一个线索,它绝对不是一个javascript的东西?
答案 0 :(得分:2)
基本上prevObject
用于允许jquery选择器链接语法的灵活性。
大多数jQuery的DOM遍历方法都在jQuery对象实例上运行,并生成一个新的,与不同的DOM元素集匹配。当发生这种情况时,就好像将新的元素集推送到在对象内维护的堆栈上。每个连续的过滤方法将新元素集推送到堆栈
每次创建一个新的过滤器时,都会构建一个与你的选择器匹配的新jquery实例,并将前一个存储在其中以允许.end()
和addBack()
函数工作(大多数DOM横向函数在内部使用pushStack)。如果未使用此属性,则每个选择器都会忘记前一个选择器,并且它不会像堆栈那样运行。想想父而不是 prevObject ,这样会更容易理解。
jQuery 1.10中不推荐使用context
属性,仅用于支持live()
方法,但必须添加它,因为构造返回对象将空jQuery构造函数合并为第一个参数和一组元素作为第二个。
var ret = jQuery.merge( this.constructor(), elems );
因为.merge
返回修改后的第一个数组,所以它的context属性可能没有正确的值,因此被正确的this.context
覆盖
检查this jsfiddle并打开控制台。您将看到prevObject的第一个值是我们创建新选择器时的文档,然后是ul
元素,因为我们使用find进行过滤。此外,您可以转到最后一个过滤器并再次查找整个选择器链直到文档。
我建议您在生产中使用JQuery API而不是此属性作为参考,但这样可以让您知道已应用于获取给定DOM元素集的所有选择器的结果。