读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 相关文章推荐
javascript数组去掉重复
May 12 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
JavaScript中的console.log()函数详细介绍
Dec 29 Javascript
不同js异步函数同步的实现方法
May 28 Javascript
关于Function中的bind()示例详解
Dec 02 Javascript
基于jQuery实现滚动切换效果
Dec 02 Javascript
JS实现滑动门效果的方法详解
Dec 19 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
Apr 17 Javascript
js实现轮播图的完整代码
Oct 26 Javascript
如何阻止小程序遮罩层下方图层滚动
Sep 05 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 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 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP实现的登录页面信息提示功能示例
2017/07/24 PHP
PHP CURL与java http使用方法详解
2018/01/26 PHP
Javascript hasOwnProperty 方法 & in 关键字
2008/11/26 Javascript
javascript 动态添加事件代码
2008/11/30 Javascript
IE JS编程需注意的内存释放问题
2009/06/23 Javascript
jQuery $.data()方法使用注意细节
2012/12/31 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JS实现可关闭的对联广告效果代码
2015/09/14 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
Vim快速合并行及vim 将文件所有行合并到一行
2017/11/27 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[01:06:43]完美世界DOTA2联赛PWL S3 PXG vs GXR 第二场 12.19
2020/12/24 DOTA
使用python遍历指定城市的一周气温
2017/03/31 Python
Python实现购物车程序
2018/04/16 Python
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
Python数据类型之List列表实例详解
2019/05/08 Python
python在不同条件下的输入与输出
2020/02/13 Python
Python实现对adb命令封装
2020/03/06 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
DataFrame 数据合并实现(merge,join,concat)
2020/06/14 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
期末自我鉴定
2014/02/02 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
给朋友的道歉短信
2015/05/12 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技