读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 DOM 学习第三章 内容表格
Feb 19 Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
js动态添加onclick事件可传参数与不传参数
Jul 29 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
JS正则表达式修饰符global(/g)用法分析
Dec 27 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
C#实现将一个字符转换为整数
Dec 12 Javascript
TypeScript之调用栈的实现
Dec 31 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
关于uniApp editor微信滑动问题
Jan 15 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
先进的自动咖啡技术,真的可以取代咖啡师吗?
2021/03/06 冲泡冲煮
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
php如何比较两个浮点数是否相等详解
2019/02/12 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
微信实现自动跳转到用其他浏览器打开指定APP下载
2019/02/15 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
python开发之函数定义实例分析
2015/11/12 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
使用Python来开发微信功能
2018/06/13 Python
pygame游戏之旅 添加游戏暂停功能
2018/11/21 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
思想政治教育专业个人求职信范文
2013/12/20 职场文书
社团招新策划书
2014/02/04 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
经典婚礼主持词
2014/03/13 职场文书
品酒会策划方案
2014/05/26 职场文书
Python实现单例模式的5种方法
2021/06/15 Python
JS开发前端团队展示控制器来为成员引流
2022/08/14 Javascript