读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控制在光标位置插入文字适合表情的插入
Jun 09 Javascript
js图片实时加载提供网页打开速度
Sep 11 Javascript
ie8下修改input的type属性报错的解决方法
Sep 16 Javascript
JavaScript中数据结构与算法(二):队列
Jun 19 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
Dec 13 Javascript
基于d3.js实现实时刷新的折线图
Aug 03 Javascript
js实现百度地图定位于地址逆解析,显示自己当前的地理位置
Dec 08 Javascript
vue.js如何将echarts封装为组件一键使用详解
Oct 10 Javascript
详解浏览器缓存和webpack缓存配置
Jul 06 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
Jul 24 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
Vertx基于EventBus发送接受自定义对象
Nov 16 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实现的封装验证码类详解
2013/06/18 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
调整PHP的性能
2013/10/30 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
Smarty高级应用之缓存操作技巧分析
2016/05/14 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
解决Extjs4中form表单提交后无法进入success函数问题
2013/11/26 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
javascript跑马灯抽奖实例讲解
2020/04/17 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
[35:55]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.11
2020/12/13 DOTA
python实现在windows服务中新建进程的方法
2015/06/30 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python字符串格式化的方法(两种)
2017/09/19 Python
详解python字节码
2018/02/07 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
python绘制简单彩虹图
2018/11/19 Python
python列表返回重复数据的下标
2020/02/10 Python
使用python脚本自动生成K8S-YAML的方法示例
2020/07/12 Python
Python之字典对象的几种创建方法
2020/09/30 Python
python读取excel数据绘制简单曲线图的完整步骤记录
2020/10/30 Python
员工培训邀请函
2014/02/02 职场文书
教师个人自我鉴定
2014/02/08 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
机器人瓦力观后感
2015/06/12 职场文书
python文件目录操作之os模块
2021/05/08 Python