jQuery中的pushStack实现原理和应用实例


Posted in Javascript onFebruary 03, 2015

pushStack是jQuery内核中一个非常重要的函数,它是如此重要,以至于许多jQuery内部函数中都频繁用到它。平常情况下,虽然很少用到它, 但是掌握这个函数,不仅有利于理解jQuery的运行原理,还方便我们做更加高级的jQuery操作。

顾名思义,pushStack是入栈, 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。数据入栈时,类似与我们进电梯,后进而先出, 如下图:

jQuery中的pushStack实现原理和应用实例

jQuery中的栈其实并不是真正的栈,而是给jQuery对象附加一个属性,指向当前对象的上一个对象, 通过end方法就能返回上一个元素。如下:

<span>1</span>
<span>2</span>
<span>3</span>
<script>
$('span').eq(0).css('fontSize','20px').end().fadeOut(2000);
</script>

上面的代码会使第一个span的字体大小为20px,并让所有span在2秒钟之内fadaout。

pushStack属于jQuery的实例方法,通过jQuery对象调用,如通过$().pushStack(document.getElementsByTagName(‘div')).css(‘background','blue')把所有div的背景都设置为蓝色。那么pushStack的原理是什么,为什么传入的DOM对象可以用css方法操作呢?先来看一下jQuery中pushStack的源码:

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;
}
//jQuery.merge
merge: function( first, second ) {
 var l = second.length,
 i = first.length,
 j = 0;
 if ( typeof l === "number" ) {
 for ( ; j < l; j++ ) {
  first[ i++ ] = second[ j ];
 }
 } else {
 while ( second[j] !== undefined ) {
  first[ i++ ] = second[ j++ ];
 }
 }
 first.length = i;
 return first;
}

pushStack的实现比较简单,主要涉及到jQuery的静态方法merge, 这个方法用来合并对象, 设计思路是在第一个对象的基础上,把第二个对象的属性(0至n)附加上去, 理解这一点很重要。再回到pushStack这个函数,首先定义一个局部变量ret存储合并对象,然后给这个对象存储prevObject和context属性,最后返回合并之后的ret对象。这里有几点需要注意:
1, this.constructor 就是jQuery的构造函数init,所以this.constructor()返回一个jQuery对象.
2, 由于jQuery merge函数返回的对象是第二个函数附加到第一个上面,所以ret也是一个jQuery对象,这里可以解释为什么pushStack出入的DOM对象也可以用CSS方法进行操作。
3, 返回的对象的prevObject属性指向上一个对象,所以可以通过这个属性找到栈的上一个对象.

Javascript 相关文章推荐
jQuery 定时局部刷新(setInterval)
Nov 19 Javascript
jQuery筛选器children()案例详解(图文)
Feb 17 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
May 21 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
JavaScript判断数组是否包含指定元素的方法
Jul 01 Javascript
AngularJS 简单应用实例
Jul 28 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
jquery.masonry瀑布流效果
May 25 jQuery
浅谈在Vue-cli里基于axios封装复用请求
Nov 06 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
Aug 09 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
vue 实现上传组件
May 31 Vue.js
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 #Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 #Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 #Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
Feb 02 #Javascript
You might like
PHP中的类-什么叫类
2006/11/20 PHP
php heredoc和phpwind的模板技术使用方法小结
2008/03/28 PHP
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
php版微信小店调用api示例代码
2016/11/12 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
JavaScript中对象property的读取和写入方法介绍
2014/12/30 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
jQuery生成假加载动画效果
2016/12/01 Javascript
JavaScript中最常用的10种代码简写技巧总结
2017/06/28 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
2020/04/26 Javascript
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
Python MD5加密实例详解
2017/08/02 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
将python图片转为二进制文本的实例
2019/01/24 Python
Python3进制之间的转换代码实例
2019/08/24 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
求职信格式范本
2013/11/15 职场文书
少儿节目主持串词
2014/04/02 职场文书
公安派出所所长四风问题个人对照检查材料
2014/10/04 职场文书
学生犯错保证书
2015/05/09 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers