Object.assign()是JavaScript中实现浅层混入最直接的方式,它将源对象的可枚举自有属性(仅第一层、不递归)复制到目标对象,返回目标对象;不处理getter/setter、忽略不可枚举属性、Symbol属性需显式传入,引用类型共享。

Object.assign() 是 JavaScript 中实现浅层混入(Mixin)最直接的方式,它把一个或多个源对象的可枚举自有属性复制到目标对象上,返回目标对象本身。
什么是浅层混入(Shallow Mixin)
混入指将一组方法或属性“注入”到某个类或对象中,复用逻辑而不依赖继承。浅层混入只复制第一层属性(不递归处理嵌套对象),Object.assign() 正好满足这一行为——它不会深拷贝,也不会覆盖原型链上的属性,只处理对象自身的可枚举属性。
基本用法:向空对象或已有对象混入
你可以把多个 mixin 对象合并进一个目标对象:
- 目标对象通常是一个空对象
{},用于构建新对象 - 也可以是已存在的实例或构造函数原型,实现运行时扩展
- 源对象顺序很重要:后出现的属性会覆盖前面同名属性
示例:
立即学习“Java免费学习笔记(深入)”;
const mixin2 = { sayHi() { return 'Hello'; }, sayBye() { return 'Bye'; } };
const obj = Object.assign({}, mixin1, mixin2);
console.log(obj.sayHi()); // 'Hello'(mixin2 覆盖了 mixin1)
console.log(obj.sayBye()); // 'Bye'
混入到类的原型上(复用到所有实例)
想让某个类的所有实例都拥有混入的方法?可以把 mixin 属性复制到类的 prototype 上:
- 适合通用工具方法(如
serialize、clone) - 注意避免污染原生原型;建议只在自己定义的类上操作
- 混入后,实例自动继承这些方法
示例:
立即学习“Java免费学习笔记(深入)”;
class Person {constructor(name) { this.name = name; }
}
const Serializable = {
toJSON() { return JSON.stringify(this); }
};
Object.assign(Person.prototype, Serializable);
const p = new Person('Alice');
console.log(p.toJSON()); // '{"name":"Alice"}'
注意事项与常见陷阱
浅层混入简单高效,但要注意几点:
- 不处理 getter/setter:Object.assign 只复制属性值,不会保留访问器属性(除非手动定义)
-
不可枚举属性被忽略:比如通过
Object.defineProperty设置的enumerable: false属性不会被复制 -
Symbol 属性需显式传入:默认不复制 Symbol 键,要写成
Object.assign(target, mixin, { [Symbol.iterator]: ... }) - 引用类型仍共享:如果 mixin 中有数组或对象,多个混入目标会共用同一份引用
不复杂但容易忽略细节。


















