本文中提到的克隆,即封装一个方法,将一个原有的对象克隆出一个新的对象,具有和原对象一样的内容。分为浅层克隆和深层克隆,这也是经常出现在笔试题中的一个知识点。
1.浅层克隆
即原始值的属性值各自更改互不影响,引用类型值更改互相影响,因此一般用于非对象类型的拷贝
function clone(origin,target){
var target = target || {};
for(var prop in origin){
target[prop] = origin[prop];
}
return target;
}
var obj = {
name:"wxt",
sex:'female',
hobby:{
reading:'technolege'
}
}
var newobj = clone(obj);
浅层克隆有个局限的地方,此时如果复制的这个对象newobj 将自己对象体中的对象做了改变,例如newobj.hobby.reading=‘fashion’, 那么obj的hobby.reading属性也跟着变了,于是就有了深层克隆
2.深层克隆
即原始值的属性值各自更改互不影响,引用类型值更改也互不影响
上面说了,为了避免原对象中具有引用类型的值,造成原对象和新对象互相影响的情况,应封装一个深层克隆。思路是:判断出原对象某个值是引用类型后,先赋值新对象一个相同的属性名,属性值则再次递归使用函数去判断(有可能多层都是引用类型对象),直到找到一个不是引用值的,才直接复制
function deepClone (origin,target){
var target = target || {}
var toStr = Object.prototype.toString;
var arrStr = '[Object Array]';
for(var prop in origin){
if(origin.hasOwnProperty(prop)){
if(typeof (origin[prop]) == 'object'){
if(toStr.call(origin[prop]) == arrStr){
target[prop] = [];
}else{
target[prop] = {}
}
deepClone(origin[prop],target[prop]);
}else{
target[prop] = origin[prop];
}
}
}
return target;
}