浅拷贝:
function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; }
深拷贝:
deepCopy(p,c) { var c = c || {}; p) { if (typeof p[i] === 'object') { c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i],c[i]); } else { c[i] = p[i]; } } c; }
浅拷贝的问题:如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
下面来个实例:
var obj1 = { name:'helloJack',inner:{ sum:5 } }; var obj2 = extendCopy(obj1,{}); obj2.name ="sss"; obj2.inner.sum = 7; console.log(obj1.name); //helloJack console.log(obj1.inner.sum); 5
存在的问题,如果经常改写这个函数的方法extendCopy
,内部再调用这个方法名就会出错,还得修改一下这个方法名,那么下面这样解决:
var extendCopy = ( f(p,c){ {}; p) { if(){ c[i] = (p[i] instanceof Array) ? [] : {}; f(p[i],c[i]); }{ c[i] = p[i]; } } c; });
可参考地址:
小tips:JS严格模式(use strict)下不能使用arguments.callee的替代方案
Javascript 面向对象编程(一):封装
Javascript面向对象编程(二):构造函数的继承
Javascript面向对象编程(三):非构造函数的继承