JavaScript:如何将字符串解释为对象引用?

33

可能是重复问题:
JavaScript如何使用变量作为对象名称

如何让JS将字符串视为对先前定义的对象的引用?简化版:

var myObject = new MyObject();

var myString = "myObject";

var wantThisToWork = myString.myproperty;

1
如果您认为这是您需要的,请不要使用变量进行存储。将myObject存储在另一个用作全局命名空间的对象中。var my_namespace = {}; my_namespace.myObject = new MyObject(); var myString = "myObject"; var itWorks = my_namespace[myString].myproperty - user1106925
@amnotiam 我的回答详细解释了你的评论所涉及的内容,从一条评论中很难理解。 - Ruan Mendes
我强烈推荐这个解决方案:https://dev59.com/xWw15IYBdhLWcg3wy-zO#6394168 - Dallas Clark
https://humanwhocodes.com/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ - RooksStrife
4个回答

49
如果变量在全局作用域中,您可以将其作为全局对象的属性访问。
var a = "hello world";
var varName = "a";
console.log( window[varName] ); // outputs hello world
console.log( this[varName] ); // also works (this === window) in this case

然而,如果它是一个局部变量,唯一的方法就是使用eval (免责声明)。

function () {
  var a = "hello world";
  var varName = "a";
  console.log( this[varName] ); // won't work
  console.log( eval(varName) ); // Does work
}

除非您可以将动态变量放入一个对象中,并像访问属性一样访问它。
function () {
  var scope = {
    a: "hello world";
  };
  var varName = "a";
  console.log( scope[varName] ); // works
}

很好的解释。我有点困惑为什么在这种情况下我们不能使用“Function”关键字。 - techie_28
@techie_28 你可以这样做,但是必须小心执行任意代码,就像 eval 一样。如果可能的话,最好避免使用它。 - Ruan Mendes
onclickB 的形式为 return someFunc(2,'abc') 时,Function(onclickB.replace("p,q", "p,q,r")) 运行良好。但是,当我仅提取函数名即 onclickB = 'someFunc' 时,将其传递给 Function(onclickB).call(....) 不会调用该函数并报错。我在这里做了什么愚蠢的事情吗? - techie_28
@techie_28 这是一个独立的问题,你应该创建一个新的帖子,这样对其他人更有用...并在此处链接它。 - Ruan Mendes
请查看以下链接:http://stackoverflow.com/questions/37388085/function-typecasting-javascript - techie_28

8
您可以使用eval函数。
eval(myString).myproperty

小心使用eval函数,如果这是用户输入的内容,它将执行任何JavaScript代码!请谨慎使用。

有更好的方法(其他人已经提到了),如果不必要,不要使用 eval - Ruan Mendes
是的,我知道除非绝对必要否则不应使用eval,我刚刚看到了那些答案。之前不知道!对这些答案点个赞。 - sachleen

7

在我看来,唯一的方法是使用eval。但是众所周知,eval是邪恶的 - 除非在受控环境下。虽然这是可能的,但我不建议使用eval,除非绝对必要。

var myObject = new MyObject();
var myString = "myObject";
var wantThisToWork = eval(myString).myproperty;

1
我不认为这应该被踩。有时候你必须使用 eval(如果你想要访问一个本地变量)。 - Ruan Mendes
确切地说!通过这个表达式,我并不是指OP(不知道OP的全称是什么)的情况需要这样做。但是除了我多次重复不要不必要地使用eval之外,这个downvote是为什么呢? - Parth Thakkar
但这仍然不是一个好答案。我认为我的答案涵盖了所有情况。 - Ruan Mendes
我并没有说这是一个很好的答案。我只是说这不是一个应该被踩的答案。 - Parth Thakkar
我只是同意你的观点。我觉得我们在无缘无故地争吵。 - Parth Thakkar
显示剩余2条评论

4

Use eval()

var myObject = {};
myObject.myproperty = "Hello";
var myString = "myObject";

var wantThisToWork = eval(myString).myproperty;

5
多个 评估 答案不够吗?这正是我给出的内容。 - Parth Thakkar
1
请仅返回翻译后的文本:不要重新发布现有答案,当您添加时已经有3个与您相似的答案。对帖子没有任何价值。 - Ruan Mendes
@ParthThakkar:当我在写我的答案时,我发布它的时间已经有很多答案了。不知何故,已发布答案的通知没有到达(网络慢)。是什么让你认为我对你写的内容感兴趣? - Anand
1
@JuanMendes:每个答案都在10分钟内得到了回答。如果你把时间分配在看足球比赛和打字回答之间,这就是你需要的时间。已经发布的信息对我没有出现,所以我不知道已经有答案被发布了。 - Anand
有太多重复的答案,甚至没有提到在答案中使用eval是多么危险。 - zakir
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接