2011-05-21 56 views
72

我想使用變量的值來訪問對象。Javascript使用變量作爲對象名稱

比方說,我有一個名爲myobject的對象。

我想用這個名稱填充一個變量並使用該變量來訪問該對象。

例子:

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

回答

100

全球:

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({}); 
+0

@Shaz:哈!如何聰明... – PeeHaa 2011-05-21 22:47:54

+0

@Shaz - 這兩個引用實際上相同的範圍;-)(假設它們在瀏覽器中執行)'alert(this === window)''。 – 2011-05-21 22:48:32

+0

@肖恩:他們是。他們呢? – PeeHaa 2011-05-21 22:49:33

6

它是一個全局變量?如果是這樣,這些實際上是window對象的一部分,因此您可以執行window[objname].value

如果它是本地的功能,我不認爲有一個很好的方法來做你想要的。

5

你不能做到這一點一般,除了在窗口範圍,在那裏你可以寫window[objname].value = 'value';

5

你可以使用eval

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

是不是'eval'被認爲是'邪惡的'?如果沒有,我可能會使用它。因爲它現在是全球性的,但我想把它變成一個清理東西的函數。 – PeeHaa 2011-05-21 22:38:01

+1

哈哈。如果變量名來自用戶輸入,請確保驗證它,以便它不包含任何'eval'可執行的JS代碼。 – Midas 2011-05-21 22:42:11

+0

@Midas:它不是直接來自用戶輸入。但是來自HTML元素的數據內容。用戶當然可以操作。但是,如果用戶可以執行他自己的JS代碼,我不會看到有什麼不好。它只會在客戶端執行或者我錯過了什麼? – PeeHaa 2011-05-21 22:46:19

7

對象存在於某些範圍,所以你幾乎總是可以通過這樣的語法訪問變量:

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] 
})(); 
3

我覺得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]); 
} 

Javascript: interpret string as object reference?

0

當使用窗口[objname表],請確保objname是全局變量。否則,有時會工作,有時會失敗。 窗口[objname] .value。

0

如果對象位於某些名稱空間中,也就是說。​​您可以使用此功能:

的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

-1
var micro=[{'test':'hello'}]; 

var device = 'test'; 

console.log(micro[device]); 
3

各地的變量名稱用方括號。

var objname = 'myobject'; 
{[objname]}.value = 'value'; 
相關問題