js深度克隆
深度克隆主要用于引用类型,因为大部分的引用类型如果某一个实例进行了修改,那么其他同一个引用的实例对象也会发生改变。
经过我小段时间的研究,以我目前的了解的来说,方法是没办法完全克隆的,你最多拿到独立属性,原型是共享的,这个没办法克隆,所以有点无解的样子,感觉这个深度克隆也只是表面意义上的克隆。
因为不是很懂啊,所以暂时先丢出写的方法吧,等待以后有机会更深入了解再详细说明,主要是我百度到的都是es6标准的一个方法,有些属性我并不了解,不知道他们的实际意义是什么。所以,很无奈啊!
function say() {
console.log('hi');
}
function person(name) {
this.name = name;
}
person.prototype.run = function() {
console.log(this.name);
}
var Messi = new person('Messi');
var box = {
a : new Date(),
b : new RegExp('le','ig'),
c : [1,2,3],
d : say,
e : Messi,
f : 'name'
}
var da = 'name';
var pox = copy(box);
function copy(data){
var type = Object.prototype.toString.call(data).slice(8,-1);
if(type == 'Object') {
if(typeof data.prototype == 'undefined') {
var elem = {};
for(var i in data) {
elem[i] = copys(data[i]);
}
return elem;
}else {
function F() {};
for(var i in data) {
elem[i] = copys(data[i]);
}
F.prototype = new data();
return new F();
}
}else {
return copys(data);
}
}
function copys(data) {
var type = Object.prototype.toString.call(data).slice(8,-1);
var al = null;
switch(type) {
case 'Date' :
al = new Date(data.getTime())
return al;
case 'RegExp' :
al = copyRegExp(data);
return al;
case 'Array' :
al = copyArray(data);
return al;
case 'Function' :
al = data;
return al;
case 'Object' :
al = copy(data);
return al;
default :
al = data;
return al;
}
function copyRegExp(reg) {
var mod = '';
if(reg.global) mod += 'g';
if(reg.ignoreCase) mod += 'i';
if(reg.multiline) mod += 'm';
return new RegExp(reg.source,mod);
}
function copyArray(array) {
var arr = [];
for(var i in array) {
arr[i] = array[i];
}
return arr;
}
}
分类:
JavaScript
标签:
js深度克隆
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据