在 JavaScript 类方法中实现浅拷贝并返回新实例,应使用 Object.assign(new Class(), this) 或解构赋值配合构造函数;structuredClone 适合现代环境但返回普通对象,需重建实例;避免 {...this}、JSON 方法及直接返回 this。

在 JavaScript 类方法中实现浅拷贝并返回新实例,核心是避免直接返回 this(那只是引用),而是创建一个新对象,把当前实例的自有属性(不包括原型链上的)复制过去。注意:浅拷贝只复制一层,嵌套对象仍共享引用。
用 Object.assign() 创建新实例
这是最常用、兼容性好的方式。先用构造函数新建空实例,再把当前实例的自有可枚举属性拷贝过去:
class Person {
constructor(name, age, address) {
this.name = name;
this.age = age;
this.address = address; // 假设是 { city: 'Beijing' }
}
clone() {
return Object.assign(new Person(), this);
}
}
⚠️ 注意:Object.assign() 只拷贝可枚举自身属性,不调用构造函数逻辑(比如初始化计算属性或副作用),且无法处理不可枚举属性或 symbol 属性。
用展开语法 {...this} + 构造函数调用
更简洁,但需确保类支持“普通对象展开”(即实例有可枚举属性,且无 getter/setter 干扰):
clone() {
return new Person(...Object.values(this));
// 或更稳妥地:
const { name, age, address } = this;
return new Person(name, age, address);
}
这种写法明确可控,适合属性少、结构稳定的情况;缺点是硬编码字段名,新增属性时需同步修改。
用 structuredClone()(现代环境)
如果目标环境支持(Chrome 98+、Node.js 17.6+),structuredClone() 能安全深拷贝(对浅层也适用),且自动处理 Date、RegExp、Map、Set 等类型:
clone() {
const plainObj = Object.assign({}, this);
return structuredClone(plainObj);
// ⚠️ 注意:structuredClone 返回的是普通对象,不是原类实例
// 所以需配合构造函数重建:
return Object.assign(new Person(), structuredClone(this));
}
不过 structuredClone 不是浅拷贝——它递归复制所有层级。若只要浅拷贝,优先选 Object.assign 或解构赋值。
避开常见陷阱
- 不要写
return {...this}—— 这返回 plain object,不是类实例,丢失原型方法 - 避免
JSON.parse(JSON.stringify(this))—— 会丢函数、undefined、Date、RegExp、循环引用,且是深拷贝 - getter/setter 属性不会被
Object.assign拷贝,需手动处理(如在clone()中显式调用 getter) - 若类有私有字段(
#field),它们不会出现在this的枚举中,需在clone()中单独复制
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











