读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 json 新手入门文档
Dec 03 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
jQuery中的each()详细介绍(推荐)
May 25 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
微信小程序 在线支付功能的实现
Mar 14 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
May 25 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
Jul 03 Javascript
JS中定位 position 的使用实例代码
Aug 06 Javascript
vue之浏览器存储方法封装实例
Mar 15 Javascript
JavaScript 预解析的4种实现方法解析
Sep 03 Javascript
Vue OpenLayer 为地图绘制风场效果
Apr 24 Vue.js
读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通过COM类调用组件的实现代码
2012/01/11 PHP
PHP Mysqli 常用代码集合
2016/11/12 PHP
thinkphp5框架扩展redis类方法示例
2019/05/06 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
juqery 学习之五 文档处理 插入
2011/02/11 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jquery计算鼠标和指定元素之间距离的方法
2015/06/26 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
基于JavaScript实现移动端无限加载分页
2017/03/27 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
利用node.js+mongodb如何搭建一个简单登录注册的功能详解
2017/07/30 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
2020/08/07 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python基于Pymssql模块实现连接SQL Server数据库的方法详解
2017/07/20 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
python实现狄克斯特拉算法
2019/01/17 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
P/Invoke是什么
2015/07/31 面试题
大学生应聘推荐信范文
2013/11/19 职场文书
建筑工程专业学生的自我评价
2013/12/25 职场文书
出国留学介绍信
2014/01/13 职场文书
怎么写工作检讨书
2014/11/16 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python