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