读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 相关文章推荐
innerHTML与jquery里的html()区别介绍
Oct 12 Javascript
javascript上传图片前预览图片兼容大多数浏览器
Oct 25 Javascript
Json序列化和反序列化方法解析
Dec 19 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
Apr 15 Javascript
深入理解jQuery之防止冒泡事件
May 24 Javascript
表单中单选框添加选项和移除选项
Jul 04 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
js前端导出Excel的方法
Nov 01 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 Javascript
解决vue-cli 打包后自定义动画未执行的问题
Nov 12 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
Nov 09 jQuery
如何使用gpu.js改善JavaScript的性能
Dec 01 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
人族 TERRAN 概述
2020/03/14 星际争霸
php抓即时股票信息
2006/10/09 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
a标签的css样式四个状态
2021/03/09 HTML / CSS
鼠标事件延时切换插件
2011/03/12 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
BootStrap创建响应式导航条实例代码
2016/05/31 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
es6+angular1.X+webpack 实现按路由功能打包项目的示例
2017/08/16 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
element-ui表格数据转换的示例代码
2018/08/24 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
antd form表单数据回显操作
2020/11/02 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
浅谈Python基础之I/O模型
2017/05/11 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
2020/02/26 Python
python类共享变量操作
2020/09/03 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
英国第一职业高尔夫商店:Clickgolf.co.uk
2020/11/18 全球购物
存储过程和sql语句的优缺点
2014/07/02 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
期中考试反思800字
2014/05/01 职场文书
志愿者工作心得体会
2016/01/15 职场文书