Javascript使用variables作为对象名称

我想用一个variables的值来访问一个对象。

比方说,我有一个名为myobject的对象。

我想用这个名称填充一个variables,并使用variables来访问该对象。

例:

var objname = 'myobject'; {objname}.value = 'value'; 

全球:

 myObject = { value: 0 }; anObjectName = "myObject"; this[anObjectName].value++; console.log(this[anObjectName]); 

全球:V2

 var anObjectName = "myObject"; this[anObjectName] = "myvalue" console.log(myObject) 

本地:v1

 (function() { var scope = this; if (scope != arguments.callee) { arguments.callee.call(arguments.callee); return false; } scope.myObject = { value: 0 }; scope.anObjectName = "myObject"; scope[scope.anObjectName].value++; console.log(scope.myObject.value); })(); 

本地:v2

 (function() { var scope = this; scope.myObject = { value: 0 }; scope.anObjectName = "myObject"; scope[scope.anObjectName].value++; console.log(scope.myObject.value); }).call({}); 

该对象存在于某个范围内,因此您几乎可以通过以下语法访问该variables:

 var objname = "myobject"; containing_scope_reference[objname].some_property = 'some value'; 

唯一的地方,这是棘手的是,当你在一个封闭的范围,你想访问一个顶级局部variables。 当你有这样的事情:

 (function(){ var some_variable = {value: 25}; var x = "some_variable"; console.log(this[x], window[x]); // Doesn't work })(); 

可以通过使用eval来解决这个问题,而不是使用eval来访问当前的作用域链。但是除非你做了很多testing,否则我不会推荐它,而且你知道这是最好的方法。

 (function(){ var some_variable = {value: 25}; var x = "some_variable"; eval(x).value = 42; console.log(some_variable); // Works })(); 

最好的办法是在永远存在的对象中引用一个名字(比如全局范围中的this或者本地范围中的一个私有的顶级variables),然后把所有其他东西放在那里。

从而:

 var my_outer_variable = {}; var outer_pointer = 'my_outer_variable'; // Reach my_outer_variable with this[outer_pointer] // or window[outer_pointer] (function(){ var my_inner_scope = {'my_inner_variable': {} }; var inner_pointer = 'my_inner_variable'; // Reach my_inner_variable by using // my_inner_scope[inner_pointer] })(); 

这是一个全局variables吗? 如果是这样,这些实际上是window对象的一部分,所以你可以做window[objname].value

如果它是本地的function,我不认为有一个好方法去做你想要的。

除了窗口范围,你可以写window[objname].value = 'value';

你可以使用eval

 eval(variablename + ".value = 'value'"); 

我认为Shaz对于局部variables的回答很难理解,尽pipe它对于非recursion函数起作用。 这是另一种我认为更清晰的方式(但这仍然是他的想法,完全相同的行为)。 它也不是dynamic访问局部variables,只是局部variables的属性。

本质上,它使用一个全局variables(附加到函数对象)

 // Here's a version of it that is more straight forward. function doIt() { doIt.objname = {}; var someObject = "objname"; doIt[someObject].value = "value"; console.log(doIt.objname); })(); 

与创build一个全局variables来存储variables基本上是一样的,所以你可以作为一个属性来访问它。 创build一个全球性的这样做是如此的黑客。

这是一个更清洁的黑客,它不会创build全局variables,而是使用本地variables。

 function doIt() { var scope = { MyProp: "Hello" }; var name = "MyProp"; console.log(scope[name]); } 

请参阅Javascript:将string解释为对象引用?

围绕variables名称使用方括号。

 var objname = 'myobject'; {[objname]}.value = 'value'; 

当使用窗口[objname]时,请确保objname是全局variables。 否则,有时会工作,有时会失败。 窗口[objname表]。价值。

如果对象是在一些名称空间即。 Company.Module.Components.Foo你可以使用这个函数:

CoffeeScript的:

 objByName: (name, context = window) -> ns = name.split "." func = context for n, i in ns func = func[n] return func 

导致Js:

 objByName: function(name, context) { var func, i, n, ns, _i, _len; if (context == null) { context = window; } ns = name.split("."); func = context; for (i = _i = 0, _len = ns.length; _i < _len; i = ++_i) { n = ns[i]; func = func[n]; } return func; } 

那么你可以创build一个新的对象或做任何事情。 注意通过父母。

 var o = new (objByName('Company.Module.Components.Foo')) objByName('some.deeply.nested.object').value 

这个想法是借鉴了类似的问题: 如果我的名字作为一个string,如何执行一个JavaScript函数

 var micro=[{'test':'hello'}]; var device = 'test'; console.log(micro[device]);