构造函数不直接实现拷贝,浅拷贝仅复制第一层引用,深拷贝需递归处理嵌套对象;可用object.assign、json序列化或递归工具函数实现,推荐分离职责并使用成熟库。

构造函数本身不直接实现浅拷贝或深拷贝,它只是创建新对象的模板。拷贝逻辑需要在实例方法、静态方法或外部工具函数中手动编写。关键在于:浅拷贝只复制第一层属性引用,深拷贝要递归处理嵌套对象。
用构造函数配合浅拷贝(如 Object.assign 或展开运算符)
可以在构造函数内部或原型上定义一个 copy 方法,用 Object.assign 或展开运算符复制自身属性:
示例:
function Person(name, info) {<br>
this.name = name;<br>
this.info = info; // 假设 info 是 { age: 25, city: 'Beijing' }<br>
}<br>
Person.prototype.shallowCopy = function() {<br>
return new Person(this.name, Object.assign({}, this.info));<br>
};
注意:上面只对 info 浅拷贝了一次,如果 info 里还有对象(比如 info.address = { street: 'XX' }),那 address 仍被共享 —— 这就是浅拷贝的典型表现。
在构造函数中实现简易深拷贝(仅限可序列化数据)
若对象只含基本类型、普通对象、数组,不含函数、undefined、Date、RegExp、Map、Set 等,可用 JSON.parse(JSON.stringify()) 快速深拷贝:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在构造函数中加一个 deepCopy 方法,返回新实例并填充深拷贝后的数据
- 先用
JSON.stringify转字符串,再JSON.parse还原,断开所有引用 - 但该方法会丢失函数、undefined、Symbol、循环引用,且 Date 变成字符串
示例:
Person.prototype.deepCopy = function() {<br>
const json = JSON.stringify(this);<br>
const copy = JSON.parse(json);<br>
return new Person(copy.name, copy.info);<br>
};
更健壮的深拷贝:构造函数 + 递归工具函数
为支持函数、Date、正则等,建议把深拷贝逻辑抽成独立函数,在构造函数中调用:
- 写一个 deepClone 工具函数,判断类型并分别处理(对象/数组 → 递归;Date/RegExp → 新建实例;基本类型 → 直接返回)
- 在构造函数的 deepCopy 方法中,用该函数克隆所有字段,再传给新实例
- 避免在构造函数里硬编码所有属性名,可用
Object.keys(this)动态遍历
例如:
Person.prototype.deepCopy = function() {<br>
const cloned = {};<br>
for (let key of Object.keys(this)) {<br>
cloned[key] = deepClone(this[key]);<br>
}<br>
return Object.assign(new Person(), cloned);<br>
};
推荐做法:构造函数专注初始化,拷贝交给专门方法
构造函数职责应是设置初始状态,而非承担拷贝逻辑。实际开发中更清晰的做法是:
- 构造函数保持简洁,只做
this.xxx = xxx - 提供
.clone()实例方法(默认浅拷贝)和.clone(true)(触发深拷贝) - 或使用成熟库如 Lodash 的
_.clone和_.cloneDeep,避免重复造轮子 - ES2022 起也可考虑
structuredClone()(现代浏览器支持),它能处理大多数内置类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










