读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脚本复制网页上的一个表格的不错实现方法
Dec 29 Javascript
Javascript技术栈中的四种依赖注入详解
Feb 23 Javascript
AngularJS基础 ng-keypress 指令简单示例
Aug 02 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
Vue实现自带的过滤器实例
Mar 09 Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 Javascript
node.js通过axios实现网络请求的方法
Mar 05 Javascript
JavaScript基于数组实现的栈与队列操作示例
Dec 22 Javascript
angular 实现下拉列表组件的示例代码
Mar 09 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
全面分析JavaScript 继承
May 30 Javascript
微信小程序image图片加载完成监听
Aug 31 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
PHP基于swoole多进程操作示例
2019/08/12 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
js使用递归解析xml
2014/12/12 Javascript
分享经典的JavaScript开发技巧
2015/11/21 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
vue实现购物车加减
2020/05/30 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python字符串替换的2种方法
2014/11/30 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
python常用知识梳理(必看篇)
2017/03/23 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
2018/10/29 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
python实现按日期归档文件
2021/01/30 Python
网吧收银员岗位职责
2013/12/14 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
出国留学计划书
2014/04/27 职场文书
市场营销调查计划书
2014/05/02 职场文书
2015年学校教研室主任工作总结
2015/07/20 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
我收到了德劲DE1107
2022/04/05 无线电
Redis基本数据类型String常用操作命令
2022/06/01 Redis