2011-12-22 68 views
1

我一直在搜索所有SO,我知道有很多這方面的話題,但我還沒有找到一個回答我的問題。JavaScript通過引用傳遞對象然後更新

我看到一個問題,有關獲取對象的值返回一個字符串像這樣:

function getPropertyByString(str) { 
    var properties = str.split("."); 
    var myTempObject = window[properties[0]]; 
    for (var i = 1, length = properties.length; i < length; i++) { 
     myTempObject = myTempObject[properties[i]]; 
    } 
    return myTempObject; 
} 

所以,如果有一個全局變量稱爲myGlobalVar,你可以將字符串「myGlobalVar.someProp.stateName」和假設這是完全有效的,例如,您將返回stateName的值,例如Arizona。

我怎麼能現在更新該屬性到加利福尼亞州?

如果我嘗試

var x = getPropertyByString('myGlobalVar.someProp.stateName'); 
x = 'California'; 

將更新x的值,而不是對象。

我試圖

var x = getPropertyByString('myGlobalVar.someProp.stateName'); 
x.value = 'California'; 

這也不能工作。

有人能幫我理解我的例子嗎?

謝謝

回答

3

請嘗試以下操作;

function setPropertyByString(path, value) { 
    var steps = path.split("."), 
     obj = window, 
     i = 0, 
     cur; 

    for (; i < steps.length - 1; i++) { 
     cur = obj[steps[i]]; 

     if (cur !== undefined) { 
      obj = cur; 
     } else { 
      break; 
     }; 
    }; 

    obj[steps[i]] = value; 
} 

它會使用它的工作,如;

setPropertyByString('myGlobalVar.someProp.stateName', 'California'); 

你可以在這裏看到它的行動; http://jsfiddle.net/xCK8J/

你沒有工作的原因是因爲字符串在JavaScript中是不可變的。您正在重新分配值爲'California'的變量x,而不是將它指向的位置更新爲'California'。

如果你已經完成了;

var x = getPropertyByString('myGlobalVar.someProp'); 
x.stateName = 'California'; 

You'd see it works;因爲您操縱的是x指向的對象,而不是將x重新指定爲其他內容。以上是setPropertyByString()方法在幕後進行的操作;它只是從你身上隱藏起來。

2

這會做的伎倆:

myGlobalVar.someProp.stateName = "California"

所以纔會這樣:

myGlobalVar["someProp"].stateName = "California"

或本:

myGlobalVar["someProp"]["stateName"] = "California"

愛特納疑心,

var x = getPropertyByString('myGlobalVar.someProp'); 
x.stateName = "California" 

需要注意的是,如果在我的最後一個例子,我做這樣的事情:

x = {stateName:"California"}; 

它不會改變myGlobalVar.someProp.stateName的價值。使用=爲LHS上的變量分配一個新值。這與將一個新值賦給變量的指稱不同。

+0

很好解釋! – dgvid 2011-12-22 16:35:49

相關問題