浅拷贝不复制方法本身,只复制对方法的引用地址,新旧对象共享同一个函数实例;修改闭包变量或this绑定会影响所有引用对象,重新赋值方法属性则互不影响。

浅拷贝不复制方法本身,只复制对方法的引用地址——新旧对象共享同一个函数实例。
方法属于引用类型,拷贝的是内存地址
JavaScript 中函数是第一类对象,本质是引用类型。浅拷贝(如 {...obj}、Object.assign())在处理方法属性时,和处理嵌套对象、数组一样:只复制该函数在堆中的地址,而非重新创建一份函数体。
- 修改函数内部的闭包变量或 this 绑定行为,会影响所有引用它的对象
- 给拷贝对象的方法属性重新赋值(如
copy.fn = newFn),不会影响原对象的fn - 但调用
copy.fn()和original.fn()执行的是同一个函数代码
常见浅拷贝方式对方法的处理一致
无论用哪种浅拷贝手段,只要没做深层遍历,方法都会被“原样传递”:
-
const copy = { ...original }→ 方法属性直接复制引用 -
Object.assign({}, original)→ 可枚举方法属性被拷贝,不可枚举或原型链上的方法不被拷贝 -
JSON.parse(JSON.stringify())→ 方法会被完全丢弃(因为 JSON 不支持函数)
实际影响:改方法内部状态会波及原对象
如果方法依赖并修改了外部变量(如模块私有变量、闭包内 state),或使用了绑定的 this,那么通过拷贝对象调用该方法,仍会作用于原始上下文:
立即学习“Java免费学习笔记(深入)”;
const counter = { count: 0 };
const obj = {
increment() { counter.count++; },
getCount() { return counter.count; }
};
const copy = { ...obj };
copy.increment();
console.log(obj.getCount()); // 1 —— 原对象的逻辑状态已被改变
注意:方法不是“数据”,通常无需深拷贝
函数体不可变(代码字符串固定),真正需要隔离的是它所操作的状态(如闭包变量、外部对象)。若需行为完全独立,应重构为工厂函数或实例化类,而不是尝试“拷贝函数”。


















