2011-06-04 5 views
2

私は、次の構造体持ってJavaScriptで(またはクラスを?):Object配列:既存のオブジェクトまたは新しいインスタンスへの参照

function ImageStruct() { 
    this.id = -1; 
    this.isCover = true; 
    this.isPaired = false; 
    this.row = -1; 
    this.column = -1; 
} 

私は、二次元配列にこのクラスを追加します。

var imgStruct = new ImageStruct(); 
imgStruct.id = id; 
imgStruct.row = row; 
imgStruct.column = column; 

$.myNameSpace.matrixPos[row][column] = imgStruct; 

私はこのような何か:

var imgStrc = $.myNameSpace.matrixPos[row][column]; 

私はimgStrcを変更する場合、$.myNameSpace.matrixPos[row][column]内のオブジェクトは、その変更を反映するものではありませんが。

これを修正する方法はありますか?

確かに非常に便利ではありません
$.myNameSpace.matrixPos[row][column].someMethod(); 

を、またはそれを変更した後、バック配列に値を養う:

+0

関連:http://stackoverflow.com/questions/518000/is-javascript-is-a-pass-by-reference-or-pass-by-value-language – Orbling

+0

'$ .myNameSpace.matrixPos [row] [column] = imgStrc'を変更してから再度実行してください。 – Orbling

+0

@Orbling:これは可能な解決策ですが、別のものがあるかどうかを知りたいと思います。コメントしてくれてありがとう。 – VansFannel

答えて

2

あなたが(例えばimgStrc.id = 42を行うことによって)そのプロパティを変更して、それをimgStrcを変更する場合、(それは同じオブジェクト実際にあるとして)その変化$.myNameSpace.matrixPos[row][column]内のオブジェクトに影響を与えます。

imgStrcを変更して再割り当てする場合にのみ、それは行いません。これを修正する方法はありません。$.myNameSpace.matrixPos[row][column] = imgStrcを設定するか、全体をラッパーオブジェクト(または1要素配列)にラップします。

1

あなたがオブジェクトを直接変更することができますいずれか

var tmp = $.myNameSpace.matrixPos[row][column]; 

tmp.someMethod(); // Do something... 

$.myNameSpace.matrixPos[row][column] = tmp; 
2

これは間違いなく "である必要があります参照によって "。私は確認するためにJsFiddleを設定しました。

http://jsfiddle.net/bJaL4/

構造体は、JavaScriptで本当にできません。明示的な値と参照の型があります。すべてのオブジェクトは参照型として扱われます。

1

JavaScriptにはポインタがありません。最後のvarステートメントは、imgStrc値をnamespaceプロパティの値で上書きします。その価値が何であれ、あなたが変更したものです。それがオブジェクトの場合は、そのオブジェクトへのすべての参照に変更が表示されます。