拷贝对象时原型链不会自动复制,需通过构造函数重建实例或object.create显式设置原型以保留类行为和继承关系;纯数据拷贝可用object.assign或展开运算符。

拷贝对象时,原型链不会自动被复制,单纯用 Object.assign、展开运算符或 JSON 序列化,得到的只是普通对象(原型指向 Object.prototype),原构造函数、类继承关系、方法、instanceof 判断全部丢失。
要确保类原型正确绑定,关键不是“拷贝原型”,而是保留或重建实例与原型链之间的关联。具体分场景处理:
深拷贝后仍需保持类实例身份
适用于需要复用原类行为(如调用原型方法、instanceof 有效)的场景:
-
✅ 正确做法:用原构造函数重新创建实例,并手动赋值属性
function cloneInstance(obj) { const Constructor = obj.constructor; const cloned = Object.assign(new Constructor(), obj); return cloned; } class User { constructor(name, age) { this.name = name; this.age = age; } greet() { return `Hi, I'm ${this.name}`; } } const u1 = new User("Alice", 30); const u2 = cloneInstance(u1); // u2 instanceof User → true ⚠️ 注意:
Constructor必须是可安全调用的函数;若类有副作用初始化逻辑(如绑定事件、发起请求),需额外控制。
需要完整继承结构的浅层克隆(如子类实例)
当对象来自继承链(如 class Admin extends User),且需保留 super 调用、静态方法等:
-
✅ 推荐方式:用
Object.create()显式设置原型,并修复constructorfunction cloneWithPrototype(obj) { const proto = Object.getPrototypeOf(obj); const cloned = Object.assign(Object.create(proto), obj); return cloned; } const admin = new Admin("Bob", 35, "root"); const adminCopy = cloneWithPrototype(admin); // adminCopy instanceof Admin → true // adminCopy.greet() → 正常调用(走 Admin.prototype → User.prototype) ❌ 不要用
cloned.__proto__ = obj.__proto__:非标准写法,且在严格模式或某些环境可能失效;应优先用Object.setPrototypeOf(cloned, proto)或Object.create(proto)。
完全避免原型干扰的纯数据拷贝
如果只是传输/缓存数据,不依赖方法或类型判断:
- ✅ 直接用
Object.assign({}, obj)或{...obj}即可 - ✅ 更安全时,用
Object.create(null)创建无原型对象防污染const safeCopy = Object.assign(Object.create(null), obj); // 无 hasOwnProperty、toString 等,但彻底免疫原型链污染
原型绑定的本质,是让新对象的 [[Prototype]] 指向正确的原型对象。只要这一步到位,instanceof、方法查找、super 行为就自然成立。不复杂但容易忽略。











