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 相关文章推荐
彪哥1.1(智能表格)提供下载
Sep 07 Javascript
jQuery 页面载入进度条实现代码
Feb 08 Javascript
javascript radio 联动效果
Mar 04 Javascript
统计出现最多的字符次数的js代码
Dec 03 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
Sep 20 Javascript
JavaScript异步调用定时方法并停止该方法实现代码
Mar 16 Javascript
JQuery控制Radio选中方法分析
May 29 Javascript
jQuery简单实现彩色云标签效果示例
Aug 01 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
JS sort方法基于数组对象属性值排序
Jul 10 Javascript
vue实现可移动的悬浮按钮
Mar 04 Vue.js
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简单压缩css样式示例
2016/09/22 PHP
基于JQuery的简单实现折叠菜单代码
2010/09/15 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
nodejs教程之入门
2014/11/21 NodeJs
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python上下文管理器全实例详解
2019/11/12 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
Java语言程序设计测试题改错题部分
2014/07/22 面试题
二年级语文教学反思
2014/02/02 职场文书
《会变的花树叶》教学反思
2014/02/10 职场文书
老公爱的承诺书
2014/03/31 职场文书
车间安全生产标语
2014/06/06 职场文书
大学迎新标语
2014/06/26 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
感恩节寄语2015
2015/03/24 职场文书
贫困证明书范文
2015/06/16 职场文书
有关骆驼祥子的读书笔记
2015/06/26 职场文书
员工考勤管理制度
2015/08/06 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python