仔细看了很多视频,发现深克隆文章都未表面如何克隆带函数属性的Object
发现也不是很难,代码如下:
var obj = {
name: "zhq",
sex: "男",
hobit: ["heisi", "baisi"],
fun: function() {
console.log(123);
}
}
var o = {}
function deepclone(newobj, oldobj) {
for (key in oldobj) {
if (oldobj[key] instanceof Array) {
newobj[key] = []
deepclone(newobj[key], oldobj[key])
} else if (oldobj[key] instanceof Function) {
newobj[key] = new Function
newobj[key] = oldobj[key]
} else if (oldobj[key] instanceof Object) {
newobj[key] = {}
deepclone(newobj[key], oldobj[key])
} else {
newobj[key] = oldobj[key]
}
}
}
deepclone(o, obj)
只不过多一条判断而已,但是我注意到 如果只使用:
newobj[key] = oldobj[key]
也可以实现,但是这样我觉得是浅克隆,虽然我并不觉得浅克隆函数属性与深克隆函数属性有区别,但是从意义上还是属于浅克隆。当加上:
newobj[key] = new Function
这样利用 new Function 在内存重新开辟一块空间,然后赋值,这样我想就可以了(但是还是觉得哪里不对,希望大佬看到可以指出,万分感谢)
以上方式使用了大量的条件分支语句,违反了开放-封闭原则。
想利用策略模式重构。。。。