读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面向对象的方式实现的弹出层效果代码
Jan 28 Javascript
jquery 的 $("#id").html() 无内容的解决方法
Jun 07 Javascript
jquery nth-child()选择器的简单应用
Jul 10 Javascript
Jquery easyui 下loaing效果示例代码
Aug 12 Javascript
JS中的log对象获取以及debug的写法介绍
Mar 03 Javascript
JS实现仿新浪黄色经典滑动门效果代码
Sep 27 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
Sep 27 Javascript
Bootstrap组件(一)之菜单
May 11 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
浅谈vue.js导入css库(elementUi)的方法
Mar 09 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中var_dump方法的使用详解
2013/06/24 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
js字符串完全替换函数分享
2014/12/03 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
python怎么删除缓存文件
2020/07/19 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
幼师自我鉴定
2014/02/01 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
电影雨中的树观后感
2015/06/15 职场文书
2016年会领导致辞稿
2015/07/29 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis
golang中的struct操作
2021/11/11 Golang