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 相关文章推荐
用JQuery模仿淘宝的图片放大镜显示效果
Sep 15 Javascript
JS下载文件|无刷新下载文件示例代码
Apr 17 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
javascript实现Email邮件显示与删除功能
Nov 21 Javascript
javascript执行环境及作用域详解
May 05 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
Aug 29 Javascript
jQuery实现复选框的全选和反选
Feb 02 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
Jun 26 Javascript
详解Vue.js中.native修饰符
Apr 24 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
Apr 16 Javascript
一文搞懂redux在react中的初步用法
Jun 09 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边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
jquery验证手机号码、邮箱格式是否正确示例代码
2013/07/28 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
JS实现的A*寻路算法详解
2018/12/14 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
浅谈Python程序与C++程序的联合使用
2015/04/07 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
详解python3中tkinter知识点
2018/06/21 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
Python基于Twilio及腾讯云实现国际国内短信接口
2020/06/18 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
军神教学反思
2014/02/04 职场文书
学术诚信承诺书
2014/05/26 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
心理学培训心得体会
2016/01/22 职场文书
优秀范文:读《红岩》有感3篇
2019/10/14 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android