读jQuery之二(两种扩展)

 更新时间:2011年06月11日 00:57:21   作者:  
上一篇分析了jQuery对象的组成,这篇分析下它的extend方法。
如下
复制代码 代码如下:

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

相关文章

  • jQuery插件之Tocify动态节点目录菜单生成器附源码下载

    jQuery插件之Tocify动态节点目录菜单生成器附源码下载

    Tocify是一个能够动态生成文章节点目录的jQuery插件,通过本文给大家分享jQuery插件之Tocify动态节点目录菜单生成器,对tocify菜单生成器相关知识感兴趣的朋友一起学习吧
    2016-01-01
  • JQuery之proxy实现绑定代理方法

    JQuery之proxy实现绑定代理方法

    下面小编就为大家带来一篇JQuery之proxy实现绑定代理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • jQuery带进度条全屏图片轮播特效代码分享

    jQuery带进度条全屏图片轮播特效代码分享

    这篇文章主要介绍了jQuery带进度条全屏图片轮播特效,图片轮播效果特别适合做产品展示,还带有进度条转接全屏图片展示,感兴趣的小伙伴可以参考下
    2015-09-09
  • jQuery插件实现大图全屏图片相册

    jQuery插件实现大图全屏图片相册

    这篇文章主要介绍了jQuery插件实现大图全屏图片相册的方法和示例,基于jQuery插件jQuery.album.js来实现的,效果非常不错,这里推荐给大家,希望大家能够喜欢。
    2015-03-03
  • jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)

    jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)

    淘宝网上的菜单滑动伸展收缩想必大家不会很陌生吧,接下来本文也使用jquery+css实现一个,代码很简洁功能很使用,感兴趣的各位可以不要错过了哈
    2013-03-03
  • jquery 指南/入门基础

    jquery 指南/入门基础

    jquery 指南/入门基础...
    2007-11-11
  • jQuery中data()方法用法实例

    jQuery中data()方法用法实例

    这篇文章主要介绍了jQuery中data()方法用法,实例分析了data()方法向匹配元素附加数据及获取数据的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • JQuery验证工具类搜集整理

    JQuery验证工具类搜集整理

    本文搜集整理了一些如邮箱、手机号码、电话号码、邮编、数字、判断是否为空、正则匹配等等常用验证;感兴趣的朋友可以了解下
    2013-01-01
  • jQuery实现的中英文切换功能示例

    jQuery实现的中英文切换功能示例

    这篇文章主要介绍了jQuery实现的中英文切换功能,结合实例形式分析了jQuery结合插件translate.js实现中英文翻译的相关操作技巧,需要的朋友可以参考下
    2019-01-01
  • JQuery入门——用bind方法绑定事件处理函数应用介绍

    JQuery入门——用bind方法绑定事件处理函数应用介绍

    bind()功能是为每个选择元素的事件绑定处理函数,感兴趣的你可以了解下它的语法bind(type, [data], fn),参数data是作为event.data属性值传递对象的额外数据对象,好好学习希望本可以帮助到你
    2013-02-02

最新评论