js中对象的浅拷贝和深拷贝

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);

 
 

猜你喜欢

转载自blog.csdn.net/weixin_39181833/article/details/80000920