JQuery中extend的用法实例分析


Posted in Javascript onFebruary 08, 2015

本文实例讲述了JQuery中extend的用法。分享给大家供大家参考。具体分析如下:

extend()函数是jQuery的基础函数之一,作用是扩展现有的对象。extend是我们在写插件的过程中常用的方法,该方法有一些重载原型。$.extend(prop) 用于扩展jQuery对象,可以用于把函数添加到jQuery名称空间中。

一、jQuery.extend函数的源码

jQuery.extend = jQuery.fn.extend = function() {
  var options, name, src, copy, copyIsArray, clone,
    target = arguments[0] || {},//参数目标对象
    i = 1,
    length = arguments.length,//参数长度
    deep = false;//是否为深度复制

  // Handle a deep copy situation
  //如果为深度复制,则目标对象和原对象游标值i,以及深度值都进行更新
  if ( typeof target === "boolean" ) {
    deep = target;
    target = arguments[1] || {};
    // skip the boolean and the target
    i = 2;
  }

  // Handle case when target is a string or something (possible in deep copy)
  //当目标对象的值类型错误,则重置为{}
  if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    target = {};
  }

  // extend jQuery itself if only one argument is passed
  //当参数值长度为1的情况下,目标对象就为jQuery自身
  if ( length === i ) {
    target = this;
    --i;
  }

  for ( ; i < length; i++ ) {
    // Only deal with non-null/undefined values
    if ( (options = arguments[ i ]) != null ) {//忽略空对象
      // Extend the base object
      for ( name in options ) {
        src = target[ name ];
        copy = options[ name ];//存储对象的值

        // Prevent never-ending loop
        if ( target === copy ) {
          continue;
        }

        // Recurse if we're merging plain objects or arrays
         //深度复制只有属性深度多于俩层的对象关系的结构的,如{a:{s:21,age:11}}或{a:['s'=>21,'age'=>11]}
        if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
          if ( copyIsArray ) {//如果是数组对象
            copyIsArray = false;
            clone = src && jQuery.isArray(src) ? src : [];

          } else {//普通对象
            clone = src && jQuery.isPlainObject(src) ? src : {};
          }

          // Never move original objects, clone them
          // 调用自身进行递归复制
          target[ name ] = jQuery.extend( deep, clone, copy );

        // Don't bring in undefined values
        } else if ( copy !== undefined ) {//非深度CP直接覆盖目标属性
          target[ name ] = copy;
        }
      }
    }
  }

  // Return the modified object
  return target;
};

二、Jquery的扩展方法原型是:

1、extend(dest,src1,src2,src3...);

它的含义是将src1,src2,src3...合并到dest中,返回值为合并后的dest,由此可以看出该方法合并后,是修改了dest的结构的。如果想要得到合并的结果却又不想修改dest的结构,可以如下使用:
 
2、var newSrc=$.extend({},src1,src2,src3...)//也就是将"{}"作为dest参数。

这样就可以将src1,src2,src3...进行合并,然后将合并结果返回给newSrc了。

如下例:

var result=$.extend({},{name:"Tom",age:21},{name:"Jerry",sex:"Boy"})

那么合并后的结果

result={name:"Jerry",age:21,sex:"Boy"}

也就是说后面的参数如果和前面的参数存在相同的名称,那么后面的会覆盖前面的参数值。
 
3、extend(boolean,dest,src1,src2,src3...)

第一个参数boolean代表是否进行深度拷贝,其余参数和前面介绍的一致
例如:

var result=$.extend( true, {}, 
{ name: "John", location: {city: "Boston",county:"USA"} }, 
{ last: "Resig", location: {state: "MA",county:"China"} } );

我们可以看出src1中嵌套子对象location:{city:"Boston"},src2中也嵌套子对象location:{state:"MA"},第一个深度拷贝参数为true,那么合并后的结果就是:

result={name:"John",last:"Resig",location:{city:"Boston",state:"MA",county:"China"}}

也就是说它会将src中的嵌套子对象也进行合并,而如果第一个参数boolean为false,我们看看合并的结果是什么,如下:

var result=$.extend( false, {}, 
{ name: "John", location:{city: "Boston",county:"USA"} }, 
{ last: "Resig", location: {state: "MA",county:"China"} } );

那么合并后的结果就是:

result={name:"John",last:"Resig",location:{state:"MA",county:"China"}}

二、Jquery中extend方法省略dest参数的情况
 
上述的extend方法原型中的dest参数是可以省略的,如果省略了,则该方法就只能有一个src参数,而且是将该src合并到调用extend方法的对象中去,如:

1、$.extend(src)

该方法就是将src合并到jquery的全局对象中去,如:

$.extend({
 hello:function(){alert('hello');}
});

就是将hello方法合并到jquery的全局对象中。
 
2、$.fn.extend(src)

该方法将src合并到jquery的实例对象中去,如:

$.fn.extend({
 hello:function(){alert('hello');}
});

就是将hello方法合并到jquery的实例对象中。
 
三、下面例举几个常用的扩展实例:

$.extend({net:{}});

这是在jquery全局对象中扩展一个net命名空间。

$.extend($.net,{
  hello:function(){alert('hello');}
})

这是将hello方法扩展到之前扩展的Jquery的net命名空间中去。

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
分享20款好玩的jQuery游戏
Apr 17 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
Nov 02 Javascript
模拟电子签章盖章效果的jQuery插件源码
Jun 24 Javascript
动态添加option及createElement使用示例
Jan 26 Javascript
jQuery中size()方法用法实例
Dec 27 Javascript
jQuery 处理页面的事件详解
Jan 20 Javascript
使用angular写一个hello world
Jan 23 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
Javascript实现图片不间断滚动的代码
Jun 22 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
Jul 23 Javascript
手把手带你搭建一个node cli的方法示例
Aug 07 Javascript
jQuery中noConflict()用法实例分析
Feb 08 #Javascript
jquery实现聚光灯效果的方法
Feb 06 #Javascript
js实现Select下拉框具有输入功能的方法
Feb 06 #Javascript
JQuery中serialize()用法实例分析
Feb 06 #Javascript
jQuery中on()方法用法实例详解
Feb 06 #Javascript
JS实现文字向下滚动完整实例
Feb 06 #Javascript
jquery中filter方法用法实例分析
Feb 06 #Javascript
You might like
php中修改浏览器的User-Agent来伪装你的浏览器和操作系统
2011/07/29 PHP
php校验表单检测字段是否为空的方法
2015/03/20 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
基于Node.js的JavaScript项目构建工具gulp的使用教程
2016/05/20 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
Vue CLI3搭建的项目中路径相关问题的解决
2018/09/17 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
解决Vue + Echarts 使用markLine标线(precision精度问题)
2020/07/20 Javascript
Python中标准模块importlib详解
2017/04/16 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
TensorBoard 计算图的可视化实现
2020/02/15 Python
对pytorch的函数中的group参数的作用介绍
2020/02/18 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
利用Python函数实现一个万历表完整示例
2021/01/23 Python
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
就业意向协议书
2015/01/29 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书