title: 面向对象(十)深拷贝和浅拷贝
date: # 文章生成时间,一般不改
categories: # 文章分类目录,可省略
- 面向对象
tags: # 文章标签,可省略
- 面向对象
- 基于原型面向对象的继承 # 个数不限,单个可直接跟在 tags 后面
深拷贝
- 提供一个函数,两个参数(元对象,要拷贝属性的对象)
- 在函数中先检查第一个参数是否有值,如果没有值那么就初始化一个空的对象
- for..in循环来遍历参数2,
- 检查当前的属性值是什么类型
- 如果是值类型,那么就直接拷贝赋值
- 如果是引用类型,那么就再调用一次这个方法,去内部拷贝这个对象的所有属性
<script >
var obj = {
name:"小花脸",
car:{
type:"客车",
},
friends:["1","2","3"]
};
//判断某个对象是否是一个数组(Array.isArray())
//兼容性问题:ES5
//先判断是isArray方法是否存在,如果不存在那么就自己为Array创建一个isArray方法
if(typeof Array.isArray != "function") {
Array.isArray = function(obj){
return Object.prototype.toString.call(obj) == "[object Array]";
}
}
var o = {};
//deepCopy(o,obj);
function deepCopy(obj1,obj2) {
obj1 = obj1 || {};
for (var i in obj2)
{
if (obj2.hasOwnProperty(i))
{
if( typeof obj2[i] == "object")
{
//判断是数组还是对象
obj1[i] = Array.isArray(obj2[i])?[]:{};
//引用类型
deepCopy(obj1[i],obj2[i]); //函数调用
}else
{
//值类型
obj1[i] = obj2[i];
}
}
}
}
deepCopy(o,obj);
console.log(o);
//共享问题
//o.car.type = "小货车";
console.log(obj);
</script>