JavaScript扩展子对象疑问:为何添加属性时出现覆盖问题?
问题分析与解决方案
看起来你搞反了Object.assign的参数顺序,导致没能给object1.sub添加属性,反而创建了一个新对象——这应该就是你觉得“子对象被覆盖”的原因。
你的代码里,Object.assign({ j: 4, m: 5 }, object1.sub)是把object1.sub的属性复制到新对象{j:4,m:5}里,最终object2会是{j:4, m:5, e:1, f:2},但object1.sub本身根本没被修改。
如果你想给原object1.sub添加新属性,应该把object1.sub作为Object.assign的第一个参数(目标对象),后面跟上要添加的属性对象:
const object1 = { a: 1, b: 2, c: 3, sub: { e: 1, f: 2 } }; // 直接修改object1.sub,添加新属性 Object.assign(object1.sub, { j: 4, m: 5 }); console.log(object1.sub); // 输出: { e: 1, f: 2, j: 4, m: 5 } console.log(object1); // 此时object1的sub已经包含新属性
如果你不想修改原有的object1.sub,而是想要一个包含原sub属性+新属性的新对象,那你的代码其实是正确的,但如果你的目标是修改原sub,那参数顺序就错了。
补充一下Object.assign的核心逻辑:它接受第一个参数作为目标对象,后续所有参数都是源对象,会把源对象的可枚举属性复制到目标对象中,最后返回目标对象。所以顺序很关键——目标对象在前,源对象在后。
内容的提问来源于stack exchange,提问作者Deano
相关产品推荐
相关产品推荐

