如何修改工厂函数内部定义并返回的类的原型方法?
错误原因
你的代码存在两处核心问题,导致修改不生效:
import("a.js")是异步加载 API,返回的是 Promise 对象,直接赋值给变量a无法拿到a.js导出的factory函数new factory()拿到的是类A的实例,实例本身没有prototype属性,你修改的目标对象本身就是错的;另外factory每次调用都会生成一个全新的A类,只修改某一次调用产生的类原型,不会影响后续factory调用返回的新类的方法。
如果你的项目是CommonJS规范,不需要处理异步导入,直接用
const factory = require('./a.js')同步获取导出对象即可。
解决方法
分两种场景处理:
场景1:可以修改a.js源码
最简单的方式是直接修改add方法的逻辑,如果你需要保留后续动态修改的能力,可以把内部类A暴露出来:
// a.js修改后代码 export default function factory() { class A { constructor() { } add(num) { return num + 1; } } // 把A类挂载为factory的静态属性,方便外部访问修改 factory.A = A return A; }
b.js中修改逻辑:
import('./a.js').then(module => { const factory = module.default // 触发A类挂载 factory() // 直接修改A类原型上的add方法 factory.A.prototype.add = function(num) { return num + 2 } // 验证效果 const A = factory() const instance = new A() console.log(instance.add(1)) // 输出3,符合预期 })
场景2:无法修改a.js源码
可以劫持重写factory函数,每次调用返回类之前先修改对应原型方法:
// b.js代码 import('./a.js').then(module => { const originalFactory = module.default // 重写factory方法 const factory = function() { // 调用原方法拿到生成的A类 const A = originalFactory.apply(this, arguments) // 修改当前A类的add方法 A.prototype.add = function(num) { return num + 2 } return A } // 后续所有逻辑都使用重写后的factory即可 const A = factory() const instance = new A() console.log(instance.add(1)) // 输出3 })
内容的提问来源于stack exchange,提问作者Chirag Vora
相关产品推荐
相关产品推荐

