本文中提到的克隆,即封装一个方法,将一个原有的对象克隆出一个新的对象,具有和原对象一样的内容。分为浅层克隆和深层克隆,这也是经常出现在笔试题中的一个知识点。
即原始值的属性值各自更改互不影响,引用类型值更改互相影响,因此一般用于非对象类型的拷贝
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属性也跟着变了,于是就有了深层克隆
即原始值的属性值各自更改互不影响,引用类型值更改也互不影响 上面说了,为了避免原对象中具有引用类型的值,造成原对象和新对象互相影响的情况,应封装一个深层克隆。思路是:判断出原对象某个值是引用类型后,先赋值新对象一个相同的属性名,属性值则再次递归使用函数去判断(有可能多层都是引用类型对象),直到找到一个不是引用值的,才直接复制
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; }