读jQuery之二(两种扩展)


Posted in Javascript onJune 11, 2011

如下

jQuery.extend = jQuery.fn.extend = function() { 
... 
};

我们可以用$.extend去扩展自定义的对象,如
var myself = {name:jack}; 
$.extend(myself, {setName: function(n){this.name=n;} }); 
myself.setName("tom");

通过$.extend为对象myself添加了setName方法。但这里主要讨论$.extend如何构建jQuery库的。不知注意到上面代码中jQuery.extend和jQuery.fn.extend是同一个函数。我们浏览下jQuery库,发现有些方法是通过调用jQuery.extend扩展的,有些则是通过调用jQuery.fn.extend扩展的。
下面分别讨论:
1,通过jQuery.extend扩展
我们知道jQuery.extend中的jQuery类型是function,即typeof jQuery值为字符串“function”。如果把jQuery当成一个类,jQuery.extend相当于为该类添加了静态方法extend。静态方法是不需要new一个实例再去调用的,通过“类名+方法名”直接调用。即jQuery.extend(...),jQuery又被赋值给$。因此我们更习惯$.extend(...)。
源码中直接调用jQuery.extend方法,只传一个参数。如下
jQuery.extend({ 
noConflict: function( deep ) { 
window.$ = _$; 
if ( deep ) 
window.jQuery = _jQuery; 
return jQuery; 
}, 
... 
});

我们知道extend中如果只传一个参数,那么将执行该句
if ( length === i ) { 
target = this; 
--i; 
}

即扩展自己,而这里的this则是function jQuery。也就是说给function jQuery添加了许多静态方法,这些方法都可以直接通过jQuery.xx(或$.xx)方式来调用,而不是先执行(调用)jQuery方法再去调用xx,如$("#id").xx。也许下面这个例子更容易理解
function fun(){}//定义一个类(函数) 
//为该类(函数)添加一个静态方法extend 
fun.extend=function(obj){ 
for(var a in obj) 
this[a] = obj[a];//注意:这里的tihs即fun 
} 
//调用extend为该类添加了静态属性name,静态方法method1 
fun.extend({name:"fun",method1:function(){}}); 
//输出name,prototype,extend,method1 
console.dir(fun)

因此,jQuery中的isFunction, isArray, isWindow等都是静态方法,只能通过$.isFunction, $.isArray, $.Window引用。而不能通过$("...").isFuction, $("...").isArray, $("...").isWindow方式引用。
2,通过jQuery.fn.extend扩展
jQuery.fn等于jQuery.prototype,也就是说给function jQuery的原型(prototype)上挂了个extend方法。通过调用jQuery.fn.extend(object)来扩展时(注意只传一个参数object),extend函数中仍然会执行
if ( length === i ) { 
target = this; 
--i; 
}

而这时的this则是jQuery.prototype(第一条提到的则是jQuery函数自身)。即给jQuery.prototype上添加了许多属性,方法。当jQuery函数执行时,如$()或jQuery(),更多时候是$()。该函数会new一个jQuery(见上一篇jQuery对象的组成)。这时则把扩展的属性,方法都附加到new生成的对象上了。也许下面这个示例更容易理解
function fun(){}//定义一个类(函数) 
//给该类原型上添加一个方法extned 
fun.prototype.extend = function(obj){ 
for(var a in obj) 
this[a] = obj[a];//注意:这里的this即是fun.prototype 
} 
//调用extend方法给fun.prototype上添加属性,方法 
fun.prototype.extend({name:"fun2",method1:function(){}}) 
//输出name,extend,method1 
console.dir(new fun())

因此扩展的属性或方法都添加到jQuery对象上了。如bind, one, unbind等可以通过$("...").bind, $("...").one, $("...").unbind方式调用。却不能通过 $.bind, $.one, $.unbind方式调用。
jQuery与Prototype一样都是通过extend方法扩展出整个库的。相对来说jQuery的扩展方式更难理解一些。
总结如下:
1,jQuery.extend({...})是给function jQuery添加静态属性或方法。
2,jQuery().extend({...})是给jQuery对象添加属性或方法。
/js/2011/zchain/zchain-0.2.js
Javascript 相关文章推荐
jQuery Selector选择器小结
May 06 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
Oct 14 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
Mar 05 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
Jun 16 Javascript
jquery通过ajax加载一段文本内容的方法
Jan 15 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
Mar 31 Javascript
bootstrap网页框架的使用方法
May 10 Javascript
浅谈es6 javascript的map数据结构
Dec 14 Javascript
用Vue写一个分页器的示例代码
Apr 22 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
Jul 31 Javascript
如何为vuex实现带参数的 getter和state.commit
Jan 04 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 12 Javascript
读jQuery之一(对象的组成)
Jun 11 #Javascript
基于jquery的无刷新分页技术
Jun 11 #Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 #Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 #Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
Jun 08 #Javascript
jquery 跨域访问问题解决方法(笔记)
Jun 08 #Javascript
精通Javascript系列之数据类型 字符串
Jun 08 #Javascript
You might like
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
Vue异步加载about组件
2017/10/31 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
vue使用技巧及vue项目中遇到的问题
2018/06/04 Javascript
Javascript的this详解
2019/03/23 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
vue实现表单未编辑或未保存离开弹窗提示功能
2020/04/08 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python中实现三目运算的方法
2015/06/21 Python
python3.x上post发送json数据
2018/03/04 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
Python控制Firefox方法总结
2019/06/03 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
Python logging模块进行封装实现原理解析
2020/08/07 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
员工自我鉴定范文
2013/10/06 职场文书
应届生英语教师求职信
2013/11/05 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
学校火灾防控方案
2014/06/09 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL