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 相关文章推荐
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
smartcrop.js智能图片裁剪库
Oct 14 Javascript
jQuery获取checkbox选中的值
Jan 28 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
Jun 03 Javascript
JavaScript禁止用户多次提交的两种方法
Jul 24 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
JavaScript判断日期时间差的实例代码
Mar 01 Javascript
Vue高版本中一些新特性的使用详解
Sep 25 Javascript
详解Vue2.0组件的继承与扩展
Nov 23 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
如何利用JS将手机号中间四位变成*号
Sep 29 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调用wsdl文件类型的接口代码分享
2014/11/19 PHP
php curl 上传文件代码实例
2015/04/27 PHP
php获取远程文件的内容和大小
2015/11/03 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
js实现div拖动动画运行轨迹效果代码分享
2015/08/27 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
新版vue-cli模板下本地开发环境使用node服务器跨域的方法
2018/04/03 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
python发送邮件实例分享
2017/07/28 Python
python对验证码降噪的实现示例代码
2019/11/12 Python
python实现超市商品销售管理系统
2019/11/22 Python
python logging添加filter教程
2019/12/24 Python
详解python 内存优化
2020/08/17 Python
基于python tkinter的点名小程序功能的实例代码
2020/08/22 Python
Python非单向递归函数如何返回全部结果
2020/12/18 Python
店长助理岗位职责
2013/12/13 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
敬老院院长事迹材料
2014/05/21 职场文书
扬州个园导游词
2015/02/06 职场文书
天下第一关导游词
2015/02/06 职场文书
大学生团日活动总结
2015/05/06 职场文书
基石观后感
2015/06/12 职场文书
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang
python 多态 协议 鸭子类型详解
2021/11/27 Python
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers