javascript中方法借用与混入的核心是利用原型链查找而非复制方法;call/apply实现临时借用,object.setprototypeof支持运行时原型混入,寄生组合式继承模拟多继承,es6高阶类混入最健壮。

JavaScript 中通过原型链实现方法借用与混入,核心在于灵活操作 prototype 和构造函数的继承关系,而不是直接复制方法。关键不是“把方法搬过去”,而是让目标对象在查找时能顺着原型链找到源方法。
用 call/apply 实现临时方法借用
这是最轻量、最常用的方式,不修改原型,只在单次调用中“借”方法:
- 适用于数组方法借用(如用数组方法处理类数组):
[].slice.call(arguments)或现代写法Array.prototype.slice.call(arguments) - 适用于借用其他对象的方法:比如让普通对象借用
Object.prototype.toString判断类型:Object.prototype.toString.call(obj) - 注意 this 绑定——
call和apply显式指定执行上下文,避免因调用方式不同导致this指向错误
用 Object.setPrototypeOf 实现运行时原型混入
动态改变对象的原型,使其继承另一对象的方法(ES6+ 推荐方式):
- 将工具对象的方法挂到一个空对象上,再设为目标对象的原型:
const mixins = { log() { console.log(this.name); } }; Object.setPrototypeOf(obj, mixins); obj.log(); - 支持多层混入:可链式设置原型,但要注意原型链过长影响性能和可读性
- ⚠️ 不要对已有原型链的对象随意覆盖
__proto__,优先用Object.setPrototypeOf,且避免在热路径频繁调用
用寄生组合式继承模拟“类混入”
想让构造函数“拥有”多个来源的方法(类似多继承),可封装混入逻辑:
- 定义混入函数:
function mixin(target, source) { Object.assign(target.prototype, source); } - 使用示例:
const Eventable = { on() {}, emit() {} }; mixin(MyClass, Eventable); new MyClass().on(...); - 这种方式本质是把方法拷贝到目标构造函数的
prototype上,不依赖原型链查找,但会丢失源方法的原始constructor和不可枚举属性 - 若需保留原型链关系,可用
Object.create(source)创建中间原型并链接
用 ES6 class + extends + 静态混入增强可维护性
结合现代语法,让混入更清晰、可复用:
- 把混入逻辑写成高阶函数:
const WithEvent = (Base) => class extends Base { on() { ... } }; - 组合使用:
class Button extends WithEvent(WithStyle(HTMLElement)) { ... } - 每个混入返回新类,保持原型链完整,方法仍可通过
super调用,也支持instanceof检测 - 这是目前最健壮、可调试、易测试的混入模式,推荐在类体系中采用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











