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 相关文章推荐
JavaScript Event事件学习第一章 Event介绍
Feb 07 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
Jul 18 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
简单实现js悬浮导航效果
Feb 05 Javascript
js实现简单的手风琴效果
Feb 27 Javascript
AngularJS中$http使用的简单介绍
Mar 17 Javascript
关于javascript作用域的常见面试题分享
Jun 18 Javascript
微信小程序 sha1 实现密码加密实例详解
Jul 06 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
Dec 11 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
Sep 19 Javascript
微信公众号H5支付接口调用方法
Jan 10 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
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
php ios推送(代码)
2013/07/01 PHP
php中过滤非法字符的具体实现
2013/10/29 PHP
PHP实现事件机制的方法
2015/07/10 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
vue axios 表单提交上传图片的实例
2018/03/16 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
2019/10/25 Javascript
python在指定目录下查找gif文件的方法
2015/05/04 Python
总结Python中逻辑运算符的使用
2015/05/13 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
根据DataFrame某一列的值来选择具体的某一行方法
2018/07/03 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
用python写PDF转换器的实现
2020/10/29 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
人事专员岗位职责范本
2014/03/04 职场文书
终止劳动合同协议书
2014/04/14 职场文书
法制宣传标语集锦
2014/06/25 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
心灵捕手观后感
2015/06/02 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python