$.extend 是jquery常用的一个方法,该方法通过传第一个布尔型参数可以指定为深复制还是浅复制,如何使用不在本文讨论。

先来理解下什么是深复制:

var ob1 = {

  'name' : 'Jack' ,

  'child' : {

    'name' : 'Tom',

    'age' : '7'

  }

};

var ob2 = {

  'name' : 'Rose' ,

  'child' : {

    'name' : 'Mike'

  }

};

浅复制后的结果:{'name' : 'Jack' ,'child' : {'name' : 'Mike'}};

深复制后的结果:{'name' : 'Jack' , 'child' : {'name' : 'Mike', 'age' : '7'}};

不同之处在于浅复制没有继承ob1.child.age属性,而是直接用ob2.child属性直接进行覆盖了,即只进行了第一层属性的合并,对子元素如果是对象的话,该对象的内部属性不会被继承合并,而会被直接覆盖。

两种复制各有自身的使用场景。

那么jquery是怎么实现的呢?大家可以看源码,但是源码看着都头疼!重要的是知道原理然后自己进行实现,先看下浅复制合并,具体思路上代码如下:

    //浅复制
function lowerExtend(){
var obj1 = arguments[0];//第一个参数
var obj2 = arguments[1];//第二个参数
         //判断是否是对象
if(typeof(obj1) != 'object' || typeof(obj2) != 'object'){
console.warn('Not object');
return
}
//存放结果对象
var resObj = {}; for(var i in obj1){
//如果对象2里面有对象1的这个属性则继承过来
if(obj2.hasOwnProperty(i)){
resObj[i] = obj2[i];
}else{
resObj[i] = obj1[i];
}
} for(var j in obj2){
//上一步已经把obj1和obj2共有的属性全替换为obj2的属性,所以这里只需把obj1里不具有的obj2的属性复制即可
if(!obj1.hasOwnProperty(j)){
resObj[j] = obj2[j]
}
}
return resObj;
}

  如果理解了以上浅复制合并的代码,那么深复制起始就是在前复制上加了一层递归调用,整改一下变成以下代码就是深复制:

//深复制
function deepExtend(){
var obj1 = arguments[0];
var obj2 = arguments[1];
//存放结果对象
var resObj = {};
if(typeof(obj1) != 'object' || typeof(obj2) != 'object'){
console.warn('Not object');
return
}
//遍历obj1的所有属性
for(var i in obj1){
//如果对象2里面有对象1的这个属性则继承过来,否则resObj放obj1[i]
if(obj2.hasOwnProperty(i)){
if(typeof(obj1[i]) == 'object'){
//如果obj1[i]是一个对象,那么递归调用这个方法,并把resObj[i]的属性设置为结果
resObj[i] = deepExtend(obj1[i],obj2[i])
}else{
resObj[i] = obj2[i];
}
}else{
resObj[i] = obj1[i];
}
} for(var j in obj2){
//上一步已经把obj1和obj2共有的属性全替换为obj2的属性,所以这里只需把obj1里不具有的obj2的属性复制即可
if(!obj1.hasOwnProperty(j)){
resObj[j] = obj2[j];
}
}
return resObj;
}

着色部分为重点不同的地方,jquery源码里其实是通过传入的第一个参数为true和false来这部分代码的是否执行的。

好了,这篇为本人的第一篇博客,不足之处希望大家不吝赐教,本人定虚心接受。

实现 $.extend 的深复制和浅复制的更多相关文章

  1. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  2. js中的深复制和浅复制

    在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...

  3. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

  4. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  5. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  6. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  7. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  8. C#深复制和浅复制

    本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...

  9. C#深复制与浅复制

    C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...

随机推荐

  1. MPU6050程序(转)

    源:MPU6050程序 初始化定义 #ifndef _MPU6050_H #define _MPU6050_H #define PORT_USED 0 #define MPU6050_ADDRESS_ ...

  2. 更改Windows Live Writer默认日志与草稿保存路径

    目的:把保存Windows Live Writer的日志与草稿文件夹My Weblog Posts移动到E:\Blog\路径下 用mklink命令,创建E:\Blog\路径下的My Weblog Po ...

  3. gulp学习指南之CSS合并、压缩与MD5命名及路径替换

    1.引入插件 var gulp = require('gulp'), // uglify = require('gulp-uglify'), concat = require('gulp-concat ...

  4. magento中文语言包的使用

    magento中文语言包的使用,我们在百度上随便就能找到一大堆. 由于本人今天是第一次使用magento,找到目录magento/app/locale  并且用语言包中的locale文件夹替换掉mag ...

  5. 在asp.net中使用ajax记录

    一.问题描述 ajax在mvc中使用频繁,比如cms中的评论功能,但由于涉及到前后端开发,日久容易忘,在此做下记录. 二.内容 控制器中代码示例: /// <summary> /// 在文 ...

  6. 安卓版php服务器的mysql数据库增删改查简单案例

    界面: index.php文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...

  7. PHP根据URL提取根域名

    <?php #使用示例 echo getBaseDomain('http://blog.jp.goo.ne.jp/index.php')->domain;echo "\n&quo ...

  8. ThinkPHP框架开发的应用的标准执行流程

    用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导类(Think\Think ...

  9. 定制jackson的自定义序列化(null值的处理)

    http://www.cnblogs.com/lic309/p/5048631.html

  10. Delphi的时间与字符串函数代码示例

    [delphi] view plaincopyprint? SysUtils.StrToDate(); SysUtils.StrToDateDef(); SysUtils.TryStrToDate() ...