浅析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 相关文章推荐
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
Js实现网页键盘控制翻页的方法
Oct 30 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
Javascript实现图片懒加载插件的方法
Oct 20 Javascript
微信小程序基于本地缓存实现点赞功能的方法
Dec 18 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
Oct 09 Javascript
postman自定义函数实现 时间函数的思路详解
Apr 17 Javascript
微信小程序实现多选框全选与取消全选功能示例
May 14 Javascript
layer弹出层自定义提交取消按钮的例子
Sep 10 Javascript
Jquery+javascript实现支付网页数字键盘
Dec 21 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发电子邮件
2006/10/09 PHP
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
php数据库抽象层 PDO
2011/05/07 PHP
php猜单词游戏
2015/09/29 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
javascript 手动给表增加数据的小例子
2013/07/10 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
2019/09/27 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[01:10]DOTA2亚洲邀请赛 征战号角响彻全场
2015/01/06 DOTA
Django中的CBV和FBV示例介绍
2018/02/25 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
新奇的小玩意:IWOOT
2016/07/21 全球购物
德国机场停车位比较和预订网站:Ich-parke-billiger
2018/01/08 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
实习单位推荐信范文
2013/11/27 职场文书
团队精神口号
2014/06/06 职场文书
应届大专生求职信
2014/06/26 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
汉语拼音教学反思
2016/02/22 职场文书
七年级上册生物的课件
2019/08/07 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
世界各国短波电台对东亚播送时间频率表(SW)
2021/06/28 无线电
一文彻底理解js原生语法prototype,__proto__和constructor
2021/10/24 Javascript