读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自动生成Dom的代码
Apr 01 Javascript
jquery 选择器引擎sizzle浅析
Feb 06 Javascript
实例讲解JS中setTimeout()的用法
Jan 28 Javascript
AngularJS基础 ng-options 指令详解
Aug 02 Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 Javascript
BootStrap网页中代码显示用法详解
Oct 21 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
Dec 08 Javascript
Bootstrap面板使用方法
Jan 16 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
Mar 01 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
Sep 06 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实现paypal整合方法
2010/11/28 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
JS+CSS实现可以凹陷显示选中单元格的方法
2015/03/02 Javascript
jQuery animate easing使用方法图文详解
2016/06/17 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
ES5 ES6中Array对象去除重复项的方法总结
2017/04/27 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
webpack4+express+mongodb+vue实现增删改查的示例
2018/11/08 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
忘记ftp密码使用python ftplib库暴力破解密码的方法示例
2014/01/22 Python
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
Python画图学习入门教程
2016/07/01 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python获取网络图片方法及整理过程详解
2019/12/20 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
交通事故检查书范文
2014/01/30 职场文书
美术教师个人工作总结
2015/02/06 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
关于感恩老师的古诗句
2019/08/20 职场文书
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS