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]);