JS语言中并没有内置的对象拷贝方法,如果有这方面的需求的话,需要自己实现下。
关于对象拷贝方法的设计,我希望可以达到以下几点要求:
1. 对象实例内的函数属性仅进行指针拷贝。
2. 对象实例内的Array和非Function并且非null的对象属性进行深度全量拷贝。
3. 继承被拷贝对象实例内所有符合深度全量拷贝的引用类型属性(包括被拷贝对象实例本身)的原型对象。
4. 不考虑含有包装对象属性的对象实例的拷贝。
5. 将该方法内置到Object的原型对象中,以扩展Object的原型方法的方式便利使用。
根据上面需求,下面是我的具体实现:
Object.prototype.clone = function(){
let nw = this instanceof Array ? [] : {};
for(let key in this){
if(this.hasOwnProperty(key)){
let value = this[key];
if(value instanceof Array || (typeof value === "object" && value !== null && !(value instanceof Function))) nw[key] = value.clone(value);
else nw[key] = value;
}
}
nw.__proto__ = this.__proto__;
return nw;
};