javascript原型链不支持真正合并多个对象属性,因每个对象仅有一个[[prototype]];常见做法是用object.assign向原型批量添加自有可枚举属性,或在实例层面组合混入对象以避免污染原型。

原型链查找只走一条路,没有合并
访问属性时,JS 沿 `[[Prototype]]` 一层层向上找,**找到第一个就停**。如果 `obj.a` 存在于 `obj` 自身,就不会去查 `obj.__proto__.a`;同理,即使 `A.prototype` 和 `B.prototype` 都有 `method`,你也无法让一个对象同时从两者继承——它只能挂在一个原型上。
用 Object.assign 给原型批量添加属性
这是最常用、也最贴近“合并效果”的做法:把多个源对象的自有可枚举属性,一次性复制到某个原型对象上。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 语法:
Object.assign(目标原型, 源1, 源2, ...) - 同名属性按顺序覆盖:后写的会替换先写的
- 只复制自身属性,不处理不可枚举属性、Symbol 键、原型链上的继承属性
- 示例:
Object.assign(A.prototype, mixin1, mixin2);<br> // A 的实例现在能用 mixin1 和 mixin2 的方法
用类组合或实例混入替代“多原型”
比起强行改原型,更推荐在实例层面组合行为:
- 把共用逻辑封装成独立对象,挂到实例上:
this.formatter = new Formatter(); this.validator = new Validator(); - 在方法里调用:
this.formatter.format(x); - 避免污染原型,也更容易单元测试和复用
注意浅拷贝陷阱
无论是 `Object.assign` 还是扩展运算符,复制嵌套对象时只复制引用:
- 如果 `mixin1.config = { theme: 'dark' }`,复制后修改 `instance.config.theme`,会影响所有共享该 config 的实例
- 需要深拷贝时,得手动处理,或借助 `structuredClone()`(现代环境)或 `_.merge()`










