Javascript 解决动态函数调用的范例/模式

Javascript 解决动态函数调用的范例/模式,javascript,typescript,design-patterns,dynamic,polymorphism,Javascript,Typescript,Design Patterns,Dynamic,Polymorphism,在过去的几天里,我一直在试图用Javascript(typescript)解决一个问题,但我无法找到一个我觉得舒服的解决方案。下面是我的设想: 你有一个类,它有一个公共函数。。此公共功能将被调用数千次,因此性能是最重要的。但是,该函数必须能够在不使用if语句或切换的情况下执行动态任务。例如 class foo { constructor() { } doWork1() { return 1 + 1; } doWork2() {

在过去的几天里,我一直在试图用Javascript(typescript)解决一个问题,但我无法找到一个我觉得舒服的解决方案。下面是我的设想:

你有一个类,它有一个公共函数。。此公共功能将被调用数千次,因此性能是最重要的。但是,该函数必须能够在不使用if语句或切换的情况下执行动态任务。例如

class foo {
    constructor() {

    }

    doWork1() {
        return 1 + 1;
    }

    doWork2() {
        return 5 + 5;
    }
}
现在,任何类都必须能够调用不可知的doWork函数,但不知道它应该调用doWork1还是doWork2。我已经研究了将函数映射到可枚举的方法,但是性能测试表明这是一种可怕的方法,尽管它是可伸缩的

因此,迄今为止,我提出的最佳解决方案是:

class foo {

    public doWork:Function;

    constructor(fnFlag) {
        if(fnFlag === 1) {
            this.doWork = this.doWork1;
        } else if (fnFlag === 2) {
            this.doWork = this.doWork2;
        }
    }

    doWork1() {
        return 1 + 1;
    }

    doWork2() {
        return 5 + 5;
    }
}
在上面的代码中,公共函数doWork可以被任何类调用,并且总是指向初始化它的函数。然而,有些事情并不适合我,我觉得这不是最好的方法。我在考虑在构造函数中传递函数并在那里赋值


如果您对解决此类问题的模式有任何想法或建议,我们将不胜感激。谢谢。

如果您可以传递要调用的函数名而不是枚举,您可以这样编写:

constructor(functionName) {
    this.doWork = this[functionName];
}

您可以使用。

“但是不知道它是否应该调用doWork1或doWork2。”-但是…它必须在某个点上知道它想要哪个。在您的示例解决方案中,它确实知道调用构造函数的时间点。是什么决定了要调用哪些函数?为什么你认为if语句不能执行?听起来像是XY的问题。。。将
foo
替换为工厂-搜索工厂模式-用所需行为实例化
foo
的子类。动态交换方法使得声明类不变量和编写测试用例变得更加困难。