可变的原型继承模型支持运行时动态调整原型链,包括用object.setprototypeof切换实例原型、构造函数+代理封装行为、mixin混入增强,以及修复constructor和instanceof兼容性。

可变的原型继承模型,核心在于让子类能动态调整其原型链,既支持继承父类行为,又允许运行时增删改查原型上的方法和属性,同时避免共享引用类型带来的副作用。它不是“固定死”的继承关系,而是具备灵活性与可控性。
用 Object.setPrototypeOf 动态切换原型
这是最直接的可变方式:在实例创建后,随时用 Object.setPrototypeOf(obj, newProto) 替换对象的隐式原型(__proto__)。
- 适用于单个实例的原型变更,不影响其他实例
- 可用于实现“运行时角色切换”,比如一个用户对象临时拥有管理员权限方法
- 注意:频繁调用会影响性能,且 V8 引擎对多次 setPrototypeOf 的对象会降级优化
构造函数 + 可配置原型代理
不直接操作原型链,而是把原型行为封装进一个可替换的对象中,再通过代理或委托方式调用:
- 定义一个
behavior属性,初始指向默认原型对象 - 所有方法调用都通过
this.behavior[method].call(this, ...args) - 外部可随时赋值
obj.behavior = adminBehavior,实现行为热替换 - 好处是完全可控、可序列化、易测试,且不破坏 instanceof 检测逻辑
混入(Mixin)驱动的运行时增强
不依赖严格的父子继承链,而是通过对象合并(浅/深拷贝)把能力注入到目标原型或实例上:
- 用
Object.assign(Constructor.prototype, mixin)向原型批量添加方法 - 用
Object.assign(instance, mixin)给单个实例加能力(优先级高于原型) - 配合
Symbol.toStringTag或自定义标识字段,可追踪哪些 mixin 已激活 - 适合插件化扩展,比如给表单控件动态加上验证、日志、国际化等模块
修复 constructor 与 instanceof 兼容性
当替换原型或混入方法后,容易丢失 constructor 指向或破坏 instanceof 判断:
- 每次修改
prototype后,手动设置Ctor.prototype.constructor = Ctor - 若需保持 instanceof 正确,新原型必须是原构造函数的实例,或使用
Object.setPrototypeOf(Ctor.prototype, Parent.prototype)建立链路 - 更稳妥的做法:用
Object.defineProperty配置constructor为不可枚举、不可写,防止被意外覆盖











