我想使用變量的值來訪問對象。Javascript使用變量作爲對象名稱
比方說,我有一個名爲myobject的對象。
我想用這個名稱填充一個變量並使用該變量來訪問該對象。
例子:
var objname = 'myobject';
{objname}.value = 'value';
我想使用變量的值來訪問對象。Javascript使用變量作爲對象名稱
比方說,我有一個名爲myobject的對象。
我想用這個名稱填充一個變量並使用該變量來訪問該對象。
例子:
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)
Local: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({});
它是一個全局變量?如果是這樣,這些實際上是window
對象的一部分,因此您可以執行window[objname].value
。
如果它是本地的功能,我不認爲有一個很好的方法來做你想要的。
你不能做到這一點一般,除了在窗口範圍,在那裏你可以寫window[objname].value = 'value';
你可以使用eval
:
eval(variablename + ".value = 'value'");
對象存在於某些範圍,所以你幾乎總是可以通過這樣的語法訪問變量:
var objname = "myobject";
containing_scope_reference[objname].some_property = 'some value';
只有當你處於一個封閉的範圍內,並且你想要訪問一個頂級局部變量時,這一點變得棘手。當你有這樣的事情:
(function(){
var some_variable = {value: 25};
var x = "some_variable";
console.log(this[x], window[x]); // Doesn't work
})();
您可以得到解決,通過使用eval
,而不是訪問當前作用域鏈...但我不建議這樣做,除非你已經做了很多的測試而你知道這是最好的方式去做事情。
(function(){
var some_variable = {value: 25};
var x = "some_variable";
eval(x).value = 42;
console.log(some_variable); // Works
})();
你最好的辦法是有一個名稱的引用始終持續到待有物品(如在一個局部範圍全局範圍或私人頂級變量this
),並把一切其他在那裏。
這樣:
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]
})();
我覺得Shaz的答案爲局部變量是很難理解的,雖然它適用於非遞歸函數。這是我認爲更清晰的另一種方式(但它仍然是他的想法,完全相同的行爲)。它也不是動態訪問局部變量,而只是局部變量的屬性。
從本質上講,它使用一個全局變量(附加到函數對象)
// 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);
})();
基本上是同樣的事情,創造一個全球性的存儲變量,這樣你就可以訪問它的屬性。創建一個全球性的,這樣做是如此黑客。
這是一個更清潔的黑客,它不會創建全局變量,而是使用局部變量。
function doIt() {
var scope = {
MyProp: "Hello"
};
var name = "MyProp";
console.log(scope[name]);
}
當使用窗口[objname表],請確保objname是全局變量。否則,有時會工作,有時會失敗。 窗口[objname] .value。
如果對象位於某些名稱空間中,也就是說。您可以使用此功能:
的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;
}
然後你就可以創建新的對象或爲所欲爲。注意通過父母。
var o = new (objByName('Company.Module.Components.Foo'))
objByName('some.deeply.nested.object').value
這個想法是從類似的問題,借:How to execute a JavaScript function when I have its name as a string
var micro=[{'test':'hello'}];
var device = 'test';
console.log(micro[device]);
各地的變量名稱用方括號。
var objname = 'myobject';
{[objname]}.value = 'value';
@Shaz:哈!如何聰明... – PeeHaa 2011-05-21 22:47:54
@Shaz - 這兩個引用實際上相同的範圍;-)(假設它們在瀏覽器中執行)'alert(this === window)''。 – 2011-05-21 22:48:32
@肖恩:他們是。他們呢? – PeeHaa 2011-05-21 22:49:33