浅析jQuery的链式调用之each函数


Posted in Javascript onDecember 03, 2010

话说回来,虽然jQuery让学习前端技术的越来越多了起来,(本人就是因为学校图书馆偶然间遇到了一本jQuery基础教程(二)开始想深入的学习前端技术),关于jQuery的博文甚至多于javascript,它让编程的门槛大大的降低了,但是它隐藏了太多细节了,形如$('#id').append('<p>xxx</p>').clone().appendTo(x).end().css(...)................这样操作的模式已经很难找到常规javascript的影子。浏览器的差异仿佛一去就不见了踪影,我不认为大部分都能在这安逸的环境再重新回到考虑javascript如何在不同浏览器能表现一致等问题,是福是祸真的很难说。
接下来言归正传.....说正经的
由于$()函数返回的是一个包裹了原生dom对象数组的对象,并且在此对象原型上扩展的函数都是为了操作原生的dom对象,所以少不了循环遍历的操作,熟悉jquery库的人都知道有个jQuery.each()函数 ,大部分的涉及jquery对象的函数都会用到这个函数: 简单的实现应该是形如这样:
(再次重申,只是简单的实现原理,不要考虑具体的功能性问题)

if (!window['$']) 
window['$'] = window['jQuery']; 
/*这里以上区域为上一篇文章的闭包内的内容 
* 定义jQuery.each 根据传入对象来执行操作 
* @param {Object} obj 
* @param {Object} func 
*简单起见我只考虑了数组以及jQuery对象两种情况,跟上一篇一样,原理应该是一致的 
*/ 
window['jQuery']['each']=function(obj,func){ 
if(obj.constructor==Array){ 
for(var i=0;i<obj.length;i++){ 
func.call(obj[i],i,obj[i]);//可以看到传入的func 应该是形如function(i,item) i代表遍历到的下标,item则代表在数组中遍历到的对象 
} 
}else if(obj.elements&&obj.elements.constructor==Array){//这里采用了传说的鸭子法则,而不是判定它是不是jQuery的实例 只要你有Array类型的elements我就对你进行操作 
for(var i=0;i<obj.elements.length;i++){ 
func.call(obj.elements[i],i,obj.elements[i]);//可以看到传入的func 应该是形如function(i,item) i代表遍历到的下标,item则代表在数组中遍历到的对象 
} 
}else{ 
return null; 
} 
}

在这个函数的基础之上可以开始扩充_jQuery的prototype了;首先就是先写一个包装器对象可以直接调用的方法each:(这个并不是重复),然后通过调用这个each函数可以完成对对象数组的遍历,
比如:
//写在闭包内 注意将昨天命名冲突了的jQuery构造函数名称改为_jQuery 
_jQuery.prototype = { 
each: function(func){ 
jQuery.each(this, func); 
return this; 
}, 
attr: function(key, value){ 
//示例定义这个set与get于一身的操作属性的函数 
if (arguments.length == 0) { 
return null; 
} 
else 
if (arguments.length == 1) { 
return this.elements[0].getAttribute(key); 
} 
else if(arguments.length == 2){ 
this.each(function(i, item){ 
//这里可以看到重新定义each方法的好处一:精简代码 ,二:在内部函数中this仍然是指向调用的包装器对象而不是window 
item.setAttribute(key, value); 
}) 
} 
} 
/* 
* 这里可以开始引入其他方法 
*/ 
}

接下来做几个简单的测试:(还是上一篇的测试html

输入:

   var k= $('#header');
                  consoles.write(k.attr('title','test title!').attr('title'));     //链式调用 

  输出:   

                   test title!

依此类推,依靠each方法可以有效的扩充包装器的方法。

之前说的影响到jQuery的链式调用的要点有三点,事实事后一想完全不是那么简单,jQuery内部代码的维护感觉并不比有些库好,虽然至少在操作上来讲使用起来非常顺手(当然只是针对一些小的操作,大的项目一时也无法接触到,也不好跟着一些大大人云亦云). 不过就算仅仅从遍历操作来看, 也可以看到其实这个库只能依托细化的插件,扩充下去只会显得臃肿不堪。

注:如果有仔细剖析了jquery源码的人肯定会对我如此拙劣的所谓的实现嗤之以鼻,我的确只是看了几本比如javascript dom高级程序设计 以及javascript 高级程序设计 设计模式等好书之后有感而发而已,可能跟具体的jquery的实现有很大的落差,可以的话希望可以指正一下。

Javascript 相关文章推荐
JQuery选择器特辑 详细小结
May 14 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
可插入图片的TEXT文本框
Dec 27 Javascript
js如何调用qq互联api实现第三方登录
Mar 28 Javascript
JsRender for object语法简介
Oct 31 Javascript
AngularJS快速入门
Apr 02 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
Feb 22 Javascript
微信小程序自定义底部弹出框
Nov 16 Javascript
微信小程序实现的一键连接wifi功能示例
Apr 24 Javascript
js设计模式之单例模式原理与用法详解
Aug 15 Javascript
JavaScript事件冒泡机制原理实例解析
Jan 14 Javascript
Jquery滑动门/tab切换实现方法完整示例
Jun 05 jQuery
jQuery的链式调用浅析
Dec 03 #Javascript
加速IE的Javascript document输出的方法
Dec 02 #Javascript
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
Dec 02 #Javascript
javascript学习之闭包分析
Dec 02 #Javascript
JavaScript OOP面向对象介绍
Dec 02 #Javascript
JavaScript 字符串处理函数使用小结
Dec 02 #Javascript
改写一个简单的菜单 弹性大小
Dec 02 #Javascript
You might like
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php数据库备份还原类分享
2014/03/20 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
Zend Framework框架Smarty扩展实现方法
2016/03/22 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
jquery中获取select选中值的代码
2011/06/27 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery带时间的日期控件代码分享
2015/08/26 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
input点击后placeholder中的提示消息消失
2016/01/15 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
python多线程方式执行多个bat代码
2016/06/07 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Django models.py应用实现过程详解
2019/07/29 Python
python获取Linux发行版名称
2019/08/30 Python
python plotly画柱状图代码实例
2019/12/13 Python
python邮件中附加文字、html、图片、附件实现方法
2021/01/04 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
白色公司:The White Company
2017/10/11 全球购物
OPPO手机官方商城:中国手机市场出货量第一品牌
2017/10/18 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
旅游管理毕业生自荐信
2013/11/05 职场文书
《悯农》教学反思
2014/04/28 职场文书
保护环境演讲稿
2014/05/10 职场文书
js判断两个数组相等的5种方法
2022/05/06 Javascript