浅拷贝和深拷贝均不处理原型继承,只复制自有可枚举属性;新对象默认继承object.prototype,无法保留原原型链;如需原型继承,应直接使用object.create或构造函数机制。

JavaScript 中对象的浅拷贝和深拷贝本身不处理原型继承层级,它们只操作对象自身的可枚举属性,完全忽略 __proto__、prototype 和原型链上的方法或属性。
浅拷贝不保留原型链
浅拷贝(如 Object.assign()、展开运算符 {...obj}、自定义 for-in 循环)仅复制源对象自身可枚举的**自有属性**,新对象的 [[Prototype]] 默认指向 Object.prototype,与原对象原型无关。
例如:
const parent = { name: 'A' };parent.say = function() { return 'hi'; };
Object.setPrototypeOf(parent, { type: 'base' }); // 设置原型
const child = { ...parent };
console.log(child.type); // undefined
console.log(Object.getPrototypeOf(child) === Object.prototype); // true
深拷贝也不还原原型关系
标准深拷贝(如 JSON.parse(JSON.stringify())、Lodash 的 cloneDeep())同样只序列化/重建自有属性,不会保存或重建 __proto__、constructor 或原型上的方法。即使源对象有复杂原型链,深拷贝结果仍是“扁平”的普通对象。
常见例外:
-
structuredClone()(现代浏览器支持)会保留Date、Map、Set等内置类型,但依然不复制自定义原型链; - 手动实现深拷贝时若显式读取并设置
Object.getPrototypeOf(obj)和Object.setPrototypeOf(newObj, proto),才可能还原原型,但这不属于“拷贝”本意,而是“克隆+继承重建”; - 使用
Object.create(proto)创建新对象并配合递归赋值,可模拟带原型的结构复制,但需明确指定原型,不是自动推导。
想保留原型层级?得用原型继承本身
如果目标是让子对象真正继承父对象的原型行为(比如复用方法、响应原型变更),应直接使用原型链机制,而非拷贝:
Child.prototype = Object.create(Parent.prototype);-
const instance = Object.create(parent);(原型式继承) -
const child = Object.assign(Object.create(Object.getPrototypeOf(parent)), parent);—— 先建原型关联,再拷贝自有属性
这种方式下,child 的 __proto__ 指向 parent 的原型,方法调用走原型链,修改原型会影响所有实例。
拷贝 + 原型组合的实用写法
实际开发中,常需要“既有独立数据,又能用父类方法”,推荐组合方案:
- 构造函数内用
Parent.call(this)初始化自有属性(避免引用共享); - 原型上通过
Object.setPrototypeOf(Child.prototype, Parent.prototype)或Child.prototype = Object.create(Parent.prototype)建立方法继承; - 不依赖拷贝来实现继承,拷贝仅用于初始化配置对象等场景。
把拷贝当作数据准备手段,把原型链当作行为复用手段,二者职责分离更清晰可靠。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











