jQuery 2.0.3 源码分析 回溯魔法 end()和pushStack()

本文深入分析了jQuery 2.0.3版本中end()和pushStack()两个关键方法的源码,揭示了它们在jQuery对象管理和链式调用中的作用,帮助读者更好地理解jQuery的内部工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    var $aaron = $("aaron");
    console.log($aaron)


    // jQuery 对象栈
    // jQuery内部维护着一个jQuery对象栈。每个遍历方法都会找到一组新元素(一个jQuery对象),然后jQuery会把这组元素推入到栈中
    // 而每个jQuery对象都有三个属性:context、selector和prevObject,其中的prevObject属性就指向这个对象栈中的前一个对象,而通过这个属性可以回溯到最初的DOM元素集。
    
    // demo
    // <ul id="aaron">
    //   parent
    //   <li>child</li>
    // </ul>
    // 
    // 这个很简单找到ul下面的li,绑定即可
    var aaron = $("#aaron");
    aaron.find('li').click(function(){
        alert(1)     //1
    })
   
    // 但现在又想给aaron绑定方法,是不是又要重新给aaron绑定?
    // 可以回溯到之前的dom元素集合
    aaron.find('li').click(function(){
        alert(1)
    }).end().click(function(){
        alert(2)
    })


    // 源码实现
    end: function() {
      return this.prevObject || this.constructor(null);
    },

    // prevObject在什么情况下会产生?
    // 答:在构建jQuery对象的时候,通过pushStack方法构建
    jQuery.fn.extend({
        find: function( selector ) {

            ...........................省略................................

             //通过sizzle选择器,返回结果集
             jQuery.find( selector, self[ i ], ret );

            // Needed because $( selector, context ) becomes $( context ).find( selector )
            ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
            ret.selector = this.selector ? this.selector + " " + selector : selector;
            return ret;
        }
    // pushStack:将一个DOM元素集合加入到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;
        },

转载:https://www.cnblogs.com/aaronjs/p/3387278.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值