javascript --- > Object.assign()浅复制解决方法

探讨了Object.assign在JavaScript中浅复制的局限性,尤其是对于set属性的复制失败。通过对比,介绍了ES2017中Object.getOwnPropertyDescriptors与Object.defineProperties方法组合使用的技巧,以实现set方法的成功复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object.assign()是浅复制(即:只复制对象得引用而,而不是新实例).它无法正确复制get属性和set属性.
看下面得例子:

// 定义一个source对象,含set方法
const source = {
    set foo(value) {
        console.log(value);
    }
};

// 使用Object.assign进行赋值
const target1 = {};
Object.assign(target1, source);

// 使用getOwnPropertyDescriptor方法获取target1中的foo 并打印到控制台
console.log(Object.getOwnPropertyDescriptor(target1 , 'foo') )

结果如下:
在这里插入图片描述
可以发现.value的属性为undefined…
下面使用ES2017引入的Object.getOwnPropertyDescriptors方法配合Object.defineProperties方法解决set方法无法复制的问题

const source = {
    set foo(value) {
        console.log(value);
    }
};

// Object.getOwnPropertyDescriptors:返回指定对象所有自身属性(非继承属性)的描述对象
// Object.defineProperties:给某个对象定义属性.
const target2 = {};
Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source));
console.log(Object.getOwnPropertyDescriptor(target2, 'foo'));

在这里插入图片描述
可以看到set方法成功复制! get方法未定义故值未undefined.

// ES6写法
const shallowMerge = (target, source) => Object.defineProperties(
    target,
    Object.getOwnPropertyDescriptors(source)
};

参考《ES6标准入门》 P177~P179

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值