var copyData = function(item) {
if(item == null) {
return null
}
if($.isArray(item)) {
var newArray = []
for(var i=0i<item.lengthi++) {
newArray.push(copyData(item[i]))
}
return newArray
}
if($.isPlainObject(item)) {
var newObj = {}
for(var p in item) {
newObj[p] = copyData(item[p])
}
return newObj
}
return item
}
有效的对象拷贝应该是指深拷贝。
浅拷贝 : 就是两个js 对象指向同一块内存地址,所以当obj1 ,obj2指向obj3的时候,一旦其中一个改变,其他的便会改变!
深拷贝:就是重新复制一块内存,这样就不会互相影响。
有些时候我们定义一个数组,把这个数据赋值给跟多对象数组中的一个字段,当我们改变对象数组中的该字段的时候,我们会把原来的数组也改变了,这样就会引起其他数组对象中的对应的字段改变,这不是我们想要的。
这个时候我们会用到深拷贝。
深拷贝的方法:
var deepCopy = function(source){
var result
(source instanceof Array) ? (result = []) : (result = {})
for (var key in source) {
result[key] = (typeof source[key]==='object') ? deepCopy(source[key]) : source[key]
}
return result
}
如果是使用了 JQ EXTJS 的话本身就有 对象克隆的 函数库可以使用 如 extjs 使用
ext.ux.util.clone()
没有用这些的话 可以自己写一个 克隆函数 网上有资源 比如
function deepClone(obj){ var result={},oClass=isClass(obj)// if(oClass==="Object"){
// result={}
// }else if(oClass==="Array"){
// result=[]
// }else{
// return obj
// }
for(key in obj){
var copy=obj[key]
if(isClass(copy)=="Object"){
result[key]=arguments.callee(copy)
}else if(isClass(copy)=="Array"){
result[key]=arguments.callee(copy)
}else{
result[key]=obj[key]
}
}
return result
}
function isClass(o){
if(o===null) return "Null"
if(o===undefined) return "Undefined"
return Object.prototype.toString.call(o).slice(8,-1)
}
或者参考 extjs 的方法
function(o) {if(!o || 'object' !== typeof o) { return o }
if('function' === typeof o.clone) { return o.clone() }
var c = '[object array]' === object.prototype.tostring.call(o) ? [] : {}
var p, v
for(p in o) {
if(o.hasownproperty(p)) { v = o[p]
if(v && 'object' === typeof v) {
c[p] = ext.ux.util.clone(v)
} else {
c[p] = v
}
}
}
return c}