You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改工厂函数内部定义并返回的类的原型方法?

错误原因

你的代码存在两处核心问题,导致修改不生效:

  1. import("a.js") 是异步加载 API,返回的是 Promise 对象,直接赋值给变量 a 无法拿到 a.js 导出的 factory 函数
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 15:09:03