整理以前的笔记,看到JS深度克隆觉得挺有趣,在总结一下:
深度克隆某个对象就是克隆对象的“自有属性”以及它的“原型链”,对于克隆原型链最好的办法就是使用它的构造函数,我们知道每个构造函数都有一个prototype属性指向它的原型对象,当然,原型对象也有一个constructor属性指回构造函数。所以利用子代对象的constructor( )方法可以得到子代对象的构造函数,再次利用构造函数创建一个对象,同时复制它的自有属性。若克隆的旧对象是包装类型的话需要向其中传递值。
Object.prototype.clone=function(){//向对象原型中添加clone方法
//this表示克隆对象
var newObj;
if(!(this instanceof Number)
&&!(this instanceof String)
&&!(this instanceof Boolean)){//保证不是包装类型
newObj=new this.constructor();
}else{
newObj=new this.constructor(this.valueOf());
}
for(var prop in this){
if(this.hasOwnProperty(prop)){//复制旧对象的自有属性
newObj[""+prop]=this[""+prop]
}
}
return newObj;
}