读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 相关文章推荐
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
基于JavaScript实现Tab选项卡切换效果
Nov 24 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
基于jQuery实现文字打印动态效果
Apr 21 jQuery
vuejs父子组件之间数据交互详解
Aug 09 Javascript
vue 1.0 结合animate.css定义动画效果
Jul 11 Javascript
你可能不知道的CORS跨域资源共享
Mar 13 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
js实现飞机大战小游戏
Aug 26 Javascript
jquery实现异步文件上传ajaxfileupload.js
Oct 23 jQuery
读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取整数函数常用的四种方法小结
2012/07/05 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
详细解读Python中的__init__()方法
2015/05/02 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
Django卸载之后重新安装的方法
2017/03/15 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
Python requests接口测试实现代码
2020/09/08 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
6种非常炫酷的CSS3按钮边框动画特效
2016/03/16 HTML / CSS
美国购买和销售礼品卡平台:Raise
2017/01/13 全球购物
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
DBA的职责都有哪些
2012/05/16 面试题
求职简历中个人的自我评价
2013/12/01 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
财务会计求职信范文
2015/03/20 职场文书
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python
Linux磁盘管理方法介绍
2022/06/01 Servers
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技