You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何简洁实现不修改原对象的对象函数式扩展?

不修改原对象的对象扩展方案

嘿,这个坑我之前踩过!确实,不少extend方法会直接修改原对象,挺闹心的。给你几个简洁又靠谱的原生方案,完全不用动原对象:

1. ES6 展开语法(最推荐,写法最直观)

直接用...把原对象的属性展开到新对象里,再添加或覆盖属性,原对象毫发无损:

const original = { name: 'Alice', age: 25 };
const extended = { ...original, age: 26, city: 'Beijing' };

console.log(original); // { name: 'Alice', age: 25 } 原对象没变化
console.log(extended); // { name: 'Alice', age: 26, city: 'Beijing' }

2. Object.assign() 方法

ES6官方提供的合并方法,只要第一个参数传空对象,就不会影响原对象:

const original = { name: 'Alice', age: 25 };
const extended = Object.assign({}, original, { age: 26, city: 'Beijing' });

console.log(original); // { name: 'Alice', age: 25 }
console.log(extended); // { name: 'Alice', age: 26, city: 'Beijing' }

⚠️ 注意:上面两种都是浅拷贝,如果对象里有嵌套的子对象,子对象还是会共享引用。如果需要深拷贝,可以用JSON.parse(JSON.stringify(original))(但要注意它不能处理函数、Symbol这类特殊值),或者写个递归深拷贝函数。

你想要的REPL会话示例

应该是这样的效果:

const obj = { x: 1 }
const extendedObj = { ...obj, y: 2 }
obj
{ x: 1 }
extendedObj
{ x: 1, y: 2 }

这样原对象完全保持原样,新对象就是扩展后的结果啦~

内容的提问来源于stack exchange,提问作者user3310334

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:13:01