实现 $.extend 的深复制和浅复制
$.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 的深复制和浅复制的更多相关文章
- .Net深复制、浅复制
在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...
- js中的深复制和浅复制
在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...
- C++学习基础七——深复制与浅复制
一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...
- php对象当参数传递 && php深复制和浅复制
把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象 因为对象是引用传递过去的 class Book { public $name; public function __construct( ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- Java中的深复制与浅复制
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...
- C#深复制和浅复制
本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...
- C#深复制与浅复制
C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...
随机推荐
- C#调用bat 不显示DOS窗口,禁止DOS窗口一闪而过
ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.CreateNoWindow = true;//不创建窗口
- 1、安卓数据存储机制——sharedPreference
项目中用到的数据存储方式: 1.这个项目里的“个人标签“.”个性签名“页面的文字存储——sharedPreference:我们项目中用到的Preference来保存用户编辑的标签.签名内容,并支持用户 ...
- time.setToNow() 取当前时间,月份有误
[java] view plaincopy Time time = new Time("GMT+8"); time.setToNow(); int year = time.ye ...
- easyui 使用随笔
1,datagrid 翻页,记住翻页前的复选框. 在onLoadSuccess:function 中,去掉 清楚选择选项 onLoadSuccess:function(){ //tab.datagri ...
- php __set()和__get()函数
<?php /* 总结: 1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用 2. 向一个难以访问的属性赋值的时候 __set() 方法被调用 3. 难以访问包括:(1)私有属 ...
- 【转】java调用存储过程和函数
一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableS ...
- PHP图片处理之图片背景、画布操作
像验证码或根据动态数据生成统计图标,以及前面介绍的一些GD库操作等都属于动态绘制图像.而在web开发中,也会经常去处理服务器中已存在的图片.例如,根据一些需求对图片进行缩放.加水印.裁剪.翻转和旋转等 ...
- Apache自带压力测试工具ab用法简介
ab命令原理 ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL进行访问.它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx.lighthttp ...
- 在DFS和BFS中一般情况可以不用vis[][]数组标记
开始学dfs 与bfs 时一直喜欢用vis[][]来标记有没有访问过, 现在我觉得没有必要用vis[][]标记了 看代码 用'#'表示墙,'.'表示道路 if(所有情况都满足){ map[i][j]= ...
- js原生设计模式——2面向对象编程之闭包1
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...