【问题标题】:Define object by a variables string [duplicate]通过变量字符串定义对象[重复]
【发布时间】:2012-01-15 13:46:05
【问题描述】:

很难解释..我基本上想做以下事情:

var doWhat = "speak";

var speak = {
    hello: function() { alert: "Hello!"; }
};

// Won't work
doWhat.hello();

这是一个不好的例子,但你应该能明白我的意思。 有没有可能?

【问题讨论】:

  • 我也不认为是其中任何一个。我认为我们在这里想要的是拥有多个具有相同“接口”的对象,并将一个对象实例化为使用该名称的任何一个对象。
  • 您要解决的根本问题是什么?换句话说,是什么让你觉得这是一个关键的绊脚石?如果我们退后几步,也许可以提出一种更惯用的方式来做你需要做的事情。
  • @MiladNaseri 那么对此的任何有效答案怎么会与对数百万个重复项的任何有效答案完全相同。您可以使用[] 访问或eval。 imo 在这里没什么可看的。
  • 公平的问题。我只知道这些问题并不完全相同,但如果你通过他们的答案来评估它们……这对我来说太过分了。不过,您确实有一个很好的观点。

标签: javascript


【解决方案1】:

您可以使用eval(doWhat).hello();。这样doWhat 的内容将被评估为对象引用。

【讨论】:

  • 是的,这会起作用,但eval() 通常被认为是一个非常糟糕的使用方法。可能还有其他更好的方法来解决根本问题。
  • 同意,但是在封闭的环境下,可以保证不被篡改,使用eval还是安全的。
  • 嗯,谢谢。现在,当我想使用此方法获取对象变量时该怎么办? obj.eval(str) 不起作用.. :/
  • 不,您只需执行obj[str] 即可动态访问对象的字段。
【解决方案2】:

你可以这样做

var doWhat = {}, str = "speak";

doWhat[str] = {
    hello : function() {}
}; 

doWhat[str].hello();

【讨论】:

  • ... 或 doWhat[ someVariable ].hello(); ...
【解决方案3】:
jsName = 'PageIndexController';

//ST1
eval("if( typeof jsName === 'undefined')alert(111);");

//ST1
eval("if( typeof " + jsName + " === 'undefined')alert(222);");

//ST1 not work
//ST2 work and the output: 222;

//there are two different way using eval, we will get 2 different outcome.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多