javascript是否可以使用字符串调用对象函数

javascript是否可以使用字符串调用对象函数,javascript,string,function,object,dynamic,Javascript,String,Function,Object,Dynamic,我有一个通用函数,它可以与适当对象中的多个其他函数对话。如果可以使用字符串来调用适当的函数 var string = "save"; var generic = (new function (string) { string."alert()"; return this; }) var save = (new function (string) { this.alert

我有一个通用函数,它可以与适当对象中的多个其他函数对话。如果可以使用字符串来调用适当的函数

 var string = "save";

 var generic = (new function (string) { 

                string."alert()";


               return this;
               })




 var save = (new function (string) { 

    this.alert = (function () {

              alert("your document has been saved")                    

              return this         

              })

        return this 
          })

var notSaved = (new function (string) { 

    this.alert = (function () {

              alert("your document has not been saved")                    

              return this         

              })

        return this 
          })

我将它用于更复杂的设置,但这里有一个示例。这可能吗?

当然可以。试着这样做:

window[string].alert();

您可以将函数封装在某个对象中,这样您就可以通过使用某个变量(在本例中称为
字符串
)传递属性名称来访问,例如:

var string = 'notSaved';
var funcs = {};

funcs.save = new function(){
    this.alert = function(){
        alert('called save.alert()');
    };
    return this;
};

funcs.notSaved = new function(){
    this.alert = function(){
        alert('called notSaved.alert()');
    };
    return this;
};

funcs[string].alert();

如果变量是全局变量(它们不应该是全局变量),它们也会自动包含在
窗口
对象中,因此您也可以这样调用它们:
窗口[string].alert()
。这不适用于非全局函数(在这种情况下,我的解决方案似乎是唯一不使用
eval()
)。

eval(“警报('test');”)

您可以使用eval调用函数。甚至可以声明函数

eval(“函数测试(){alert(“test”);})


test()

看看你的代码,很难说出你到底想要实现什么。尽管如此,这里有一些想法可能是相关的

首先,让我们制作两个对象:

var rabbit = {
  name: 'Peter',
  hop: function () {
    return this.name + ' hopped!'
  },
  jump: function () {
    return this.name + ' jumped!'
  }
}

var hairy_maclary = {
  name: 'Hairy Maclary',
  jump: function () {
    return this.name + ' jumped over the fence!'
  }
}
现在,您可以定义一个函数,在传递给它的任何对象上调用
hop
方法:

function hop(object) {
  return object.hop()
}

hop(rabbit) // 'Peter hopped!'
我不知道你为什么要这样做,而不是直接调用
hop
,但也许你想在之前或之后做额外的事情

如果愿意,您可以创建一个完全通用的函数,该函数将调用给定对象上的给定方法:

function invokeMethod(object, method) {
  object[method]()
}

invokeMethod(hairy_maclary, 'jump') // 'Hairy Maclary jumped over the fence!'

然而,这是一件非常奇怪的事情。也许您可以提供更多关于您实际尝试执行的操作的想法,因为您的示例代码非常奇怪。

我不知道您试图从中执行的操作。“使用字符串调用适当的函数”?将函数放入嵌套对象中,这样您就可以调用类似于
generic[“save”][“alert”]()
?请注意,您不需要新函数(){},您可以只使用函数(){}。这对我来说似乎很奇怪。为什么把事情弄得这么复杂?
funcs.save={alert:function(){alert('called save.alert()')}
不会达到同样的效果,但要简单得多吗?@davidchambers:“为什么要让事情变得如此复杂?”:(默认情况下,JavaScript没有任何“类”),OP采用了其中一种方法——我也采用了同样的方法。从我引用的文章中可以看出:“如果您不习惯它,它可能看起来有点混乱(…),这是一个选项,当您确实想要一个只使用一次的构造函数,并且没有给它命名的意义时。”。你觉得怎么样?还是值得否决吗?@Tadeck,一般来说,在软件工程中,当有多种方法实现同一件事情时,你总是希望从可读性的角度选择最不复杂的方法。其他程序员可能有一天不得不修改您的代码;)我们都知道,JS为您提供了大量表达相同内容的方法;)@Ryan:在软件工程中,我被教导最好的方法是选择。。。适合特定任务的最佳解决方案。我相信你们并没有洞察力,也不知道OP为什么选择使用这个解决方案。至少在一种情况下,您的解决方案是无用的——OP希望能够定义在构造对象时会发生什么(换句话说,当OP希望为构造函数定义代码时)。你同意吗?@Tadeck,我没说你应该使用不同的解决方案;我说过,如果你有多种方式来表达同一件事,那么就使用可读性更强的形式(如果它对性能没有太大影响的话)。在这种特殊情况下,不需要进行任何构造,因为他的警报功能没有以任何有意义的方式使用
。他只需要具有定义为对象属性的
警报
函数的独立对象。只要让他做一些像
saved={alert:function(){…}}
。这更容易阅读,而且它实际上与您正在做的事情是一样的。我更愿意看到促进良好编程实践的答案。在某些情况下,
eval
是必要的,但这肯定不是其中之一。