function deepCopy(object){
var copy_object = {};
Object.setPrototypeOf(copy_object, Object.getPrototypeOf(object));
var descriptors = Object.getOwnPropertyDescriptors(object);
for(let key in descriptors){
if(typeof descriptors[key].value === 'object'){
Object.defineProperty(copy_object, key, {
value: deepCopy(descriptors[key].value),
enumerable: descriptors[key].enumerable,
writable: descriptors[key].writable,
configurable: descriptors[key].configurable,
});
//console.log(Object.getOwnPropertyDescriptor(copy_object, key));
}else{
Object.defineProperty(copy_object, key, descriptors[key]);
}
}
return copy_object;
}
function shallowCopy(object){
var copy_object = Object.create(Object.getPrototypeOf(object),Object.getOwnPropertyDescriptors(object));
return copy_object;
}
测试代码:
var o = new Object({
_a: 3,
b: [2],
});
Object.defineProperty(o, 'a', {
configurable: true,
get: function(){
return this._a;
//console.log(this);
},
set: function(newValue){
this._a = newValue;
//console.log(this.a);
},
});
o.a = 4
var o1 = shallowCopy(o);
var o2 = deepCopy(o);
console.log(o1);
console.log(o2);
o1.b.push(666);
console.log(o);
console.log(o2);