2011-12-22 18 views
1

私はSOのすべてを検索してきましたが、これに関する多くのトピックがあることを知っていますが、私の質問に答えたものは見つかりませんでした。Javascriptが参照渡しでオブジェクトを渡す

私は戻って、このような文字列からオブジェクト値を得ることについて質問を見た:myGlobalVarと呼ばれるグローバル変数がある場合、あなたは文字列を渡すことができるように

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.someProp.stateName」とあなたがstateNameの値を返すことになるすべての有効なことを暗唱します。例えば、アリゾナ。

どうすればそのプロパティをカリフォルニアに更新できますか?

私はxの値ではなく、オブジェクトを更新します

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

をしよう。

私はどちらか動作しませんでした

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で文字列が不変であるため、あなたがうまくいかなかった理由があります。変数xを、値が 'California'になるように更新するのではなく、値 '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"

をだから、これは希望tively、私の最後の例では、私はこのような何か、場合という

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

注:

x = {stateName:"California"}; 

をそれはmyGlobalVar.someProp.stateNameの値を変更しません。

=を使用すると、LHSの変数に新しい値が割り当てられます。これは、変数の参照先に新しい値を割り当てるのと同じことではありません。

+0

すてきな説明! – dgvid

関連する問題