构造函数本身不直接提供深浅拷贝能力,但可通过内部逻辑实现:浅拷贝用Object.assign或扩展运算符复制顶层属性,嵌套对象引用共享;深拷贝用structuredClone等确保完全隔离,选择依据是数据特征与使用场景。

构造函数本身不直接提供深浅拷贝能力,但它可以作为封装拷贝逻辑的载体。关键在于:在构造函数内部,用合适的策略处理传入的参数对象——是直接赋值(浅拷贝)、还是递归复制(深拷贝)。下面分情况说明实际做法。
浅拷贝:构造函数中只复制第一层属性
适用于配置对象、简单数据结构,性能好但不隔离嵌套引用。
- 用 Object.assign() 或扩展运算符 {...obj} 复制顶层属性
- 注意:若参数含对象或数组,它们的引用会被共享
- 示例:
function Person(config) {
Object.assign(this, config); // 浅拷贝 config 的所有可枚举属性
}
const data = { name: 'Alice', address: { city: 'Beijing' } };
const p1 = new Person(data);
p1.address.city = 'Shanghai';
console.log(data.address.city); // 'Shanghai' —— 原对象被改了
深拷贝:构造函数中递归处理嵌套结构
确保实例与原始数据完全独立,适合状态敏感场景(如表单初始值、组件快照)。
- 推荐使用 structuredClone()(现代浏览器支持,2026年已广泛可用)
- 兼容旧环境可用 JSON.parse(JSON.stringify())(仅限纯数据)
- 或手写递归函数,支持 Date、RegExp、循环引用等
- 示例(用 structuredClone):
function SafePerson(config) {
this.data = structuredClone(config); // 深拷贝整个 config
}
const data = { name: 'Bob', hobbies: ['reading', { type: 'tech' }] };
const p2 = new SafePerson(data);
p2.data.hobbies[1].type = 'art';
console.log(data.hobbies[1].type); // 'tech' —— 完全不影响原数据
构造函数里怎么选?看用途和数据特征
不是“必须深拷贝”,而是按需决定:
- 如果只是读取配置、初始化默认值 → 浅拷贝够用,开销小
- 如果后续会修改实例内部对象,且不能影响外部传入源 → 必须深拷贝
- 若数据含函数、undefined、Symbol、Date 等 → 避免 JSON 方案,优先 structuredClone 或 lodash.cloneDeep
- 若存在循环引用(如父子关系对象)→ 手写递归 + WeakMap 记录已克隆对象,防止栈溢出











