object.assign 是属性拷贝,用于合并对象数据;object.setprototypeof 是修改原型链,用于设置继承关系。二者目的、作用对象和效果均不同,不可混用或替代。

Object.setPrototypeOf 和 Object.assign 完全是两类操作,目的、作用对象和效果都不同,不能混用或替代。
Object.assign 是属性拷贝,用于合并对象数据
它把一个或多个源对象的自身可枚举属性浅拷贝到目标对象上,只影响目标对象的自有属性,不改变原型链。
- 执行的是“值复制”:比如
Object.assign({}, {a: 1}, {b: 2})返回{a: 1, b: 2} - 同名属性会被后面的对象覆盖(从左到右依次合并)
- 只拷贝可枚举属性,不处理 getter/setter 或不可枚举属性(除非手动定义)
- 是浅拷贝:如果属性值是对象,拷贝的是引用,不是新对象
Object.setPrototypeOf 是修改原型链,用于设置继承关系
它不添加或修改目标对象自身的属性,而是把目标对象的 [[Prototype]] 指向另一个对象,从而建立原型继承关系。
- 例如:
Object.setPrototypeOf(obj, proto)让obj.__proto__ === proto - 之后
obj可以访问proto上的属性和方法(通过原型链查找) - 不会在
obj上创建任何新属性,obj自身仍是空的(除非原本就有) - 会影响所有依赖原型链的行为,比如
instanceof、hasOwnProperty判断逻辑
典型误用场景对比
假设你有两个对象:
const base = { type: 'animal' };
const child = { name: 'dog' };
- 用
Object.assign(child, base)→child变成{name: 'dog', type: 'animal'},type成为自有属性 - 用
Object.setPrototypeOf(child, base)→child仍是{name: 'dog'},但child.type能读到'animal'(来自原型)
选哪个取决于你要解决的问题
想把多个配置拼成一个新对象?用 Object.assign。
想让一个对象继承另一个对象的方法或共享状态?用 Object.setPrototypeOf(不过更推荐用 class 或 Object.create 实现继承)。











