javascript class 本身不提供拷贝能力,浅拷贝仅复制实例自有可枚举属性(基本类型独立、引用类型共享),深拷贝需递归处理嵌套结构并注意方法丢失、循环引用等问题。

JavaScript 中的 class 本身不提供拷贝能力,浅拷贝和深拷贝要靠外部方法实现,核心是操作实例的属性(即 this 上的自有属性),而不是类定义本身。
浅拷贝:复制对象一层属性
浅拷贝只复制实例自身可枚举属性的引用值(如对象、数组)仍共享,基本类型(如字符串、数字)则独立。常用方式有:
- Object.assign():适用于简单实例,需先获取自有属性
- 展开运算符(...):同上,简洁但不处理不可枚举或 symbol 属性
- for...in + hasOwnProperty:更可控,可过滤原型链属性
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
constructor(name, address) {
this.name = name;
this.address = address; // 假设是普通对象
}
}
const p1 = new Person("Alice", { city: "Beijing" });
const p2 = Object.assign(Object.create(Object.getPrototypeOf(p1)), p1);
// 或 const p2 = { ...p1 };(仅限可枚举、非 symbol 属性)
深拷贝:递归复制所有嵌套结构
深拷贝需遍历所有层级,对每个引用类型属性重新创建副本。注意:class 实例不是纯 POJO,直接 JSON 序列化会丢失方法和原型信息。
- JSON.parse(JSON.stringify()):最简但有严重限制——丢方法、丢 undefined、丢 function、丢 Date/RegExp 等,仅适合纯数据对象
- structuredClone()(现代浏览器):支持 Map、Set、Date、RegExp 等,保留原型链(对普通对象有效),但对自定义 class 实例仍可能丢失方法(因它克隆的是“数据快照”,不调用 constructor)
-
手动递归 + 构造函数重建:最可靠方式,需在 class 中定义静态
from()或实例clone()方法
推荐写法(手动控制):
class Person {constructor(name, address) {
this.name = name;
this.address = address;
}
clone() {
return new Person(
this.name,
this.address ? { ...this.address } : null // 浅拷贝 address,如需深拷贝可递归
);
}
}
注意事项与常见误区
- class 实例的原型方法不会被拷贝,拷贝的只是属性;方法始终来自 prototype
- Symbol 属性、不可枚举属性(如通过
Object.defineProperty添加的)默认不会被Object.assign或展开运算符复制 - 循环引用会导致深拷贝无限递归,手动实现时需用 WeakMap 记录已拷贝对象
- 继承关系下,拷贝子类实例时要注意保持 constructor 正确,可用
new this.constructor(...)
实用建议
- 多数场景优先用
clone()实例方法,逻辑清晰、类型安全、可定制深度 - 若需通用深拷贝工具,用
structuredClone()(兼容性查 caniuse),再手动补原型或方法 - 避免依赖 JSON 方式处理含函数或特殊对象的 class 实例
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










