8

変数「my_a」とletters.aの両方が同じオブジェクトを指すようにしようとしています。

//i want letters.a to reference (point to) my_a, not be a copy...
//expected output should be: letters.a = c
//made variables into Objects.. but didn't help.

var my_a = new Object('a');
var my_b = new Object('b');
var letters = {'a': my_a, 'b': my_b};

$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('leters.a = ' + letters.a + '<br>');

my_a = new Object('c');

$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('letters.a = <span style="color:red">' + letters.a + '</span>');
​

このフィドルを参照してください:

http://jsfiddle.net/jCsUq/1/

しかし、出力からわかるように、これは機能していません。

何か案は?これはjavascriptで可能ですか?

ありがとうございました。

4

6 に答える 6

5

あなたの質問への答えは「はい」ですが、あなたの質問はあなたがやろうとしていることを正確に説明していないと思います. あなたが望むのは、変数「my_a」への参照であることです。これは、演算子letters.aを使用して C++ で何ができるかという意味です。&これは JavaScript では不可能です。

声明で:

my_a = new Object('c');

「my_a」に新しい別の値を与えています。したがって、letters.a「my_a」は変更されていますが、以前と同じことを参照しています。変数またはオブジェクト プロパティを (JavaScript で) 別のものを「追跡」する方法はありません。

編集— 実際には、「my_a」の現在の値を返す「letters」の「a」プロパティの「getter」を定義することで、探しているようなことができると思います。使用している JavaScript エンジンでその機能が必要になりますが、次のようになります。

var letters = {};
Object.defineProperty(letters, "a", {
  get: function() { return my_a; },
  set: function(v) { my_a = v; }
});

残念ながら、IE9 より前の IE ではサポートされていません。これが更新されたjsfiddleです。

于 2012-08-27T14:22:10.200 に答える
4

次のように、JavaScript で 2 つの変数を同じオブジェクトまたは値にポイントできます。

var a = b = {};
// both a and b now reference the same object

また、オブジェクト コンストラクターを使用する必要はありません。中括弧はコンストラクターとして機能し、入力を節約します。つまり、これ:

var a = new Object();

以下と同等です。

var a = {}
于 2012-08-27T14:22:01.637 に答える
1

ポインターの概念に混乱しています。オブジェクトを変数に格納すると、実際にはそのオブジェクトのアドレスが変数に格納されます。

したがって、my_a と letters.a の両方に同じオブジェクトのアドレスが含まれています。次に、my_a を変更して新しいオブジェクトのアドレスを含めます。しかし、 letters.a にはまだ最初のオブジェクトのアドレスが含まれています!

したがって、スクリプトの最後には、オブジェクト 'c' を指す my_a と、オブジェクト 'a' を指す letters.a があります。

'c' と呼ぶオブジェクトを指すように letters.a と my_a を取得する唯一の方法は、次のようにすることです。

letters.a = my_a

再度、新しい 'c' オブジェクトのアドレスを含むように letters.a を設定します。

ところで、より基本的な型 (ints、char など) を保持する変数には、実際のデータへのポインターではなく、実際には変数自体の値が含まれます。

于 2012-08-27T14:22:57.750 に答える
0

はい、可能です。

あなたは正しい方向に進んでいましたが、小さな間違いを犯しました。初期化すると、その時点でvar letters = {'a': my_a, 'b': my_b};my_a が指していたオブジェクトが挿入されました。

への直接ポインタがすでに含まれているため、後で変更my_aしても変更されませんでした。lettersObject('a')

于 2012-08-27T14:24:34.603 に答える
0

はい、可能性は非常に高く、デフォルトです。ただし、値を変更するつもりの場合、コードでは参照 (my_a = new Object('c');) を変更しています。これは、文字列の代わりに配列を使用すると、より明確に示されます。たとえば、my_1 = [23]; my_1[0] = 8;

于 2012-08-27T14:25:25.800 に答える
0

そのような構造を使用していない理由:

var letters = {'a': (new Object('a')), 'b': (new Object('b'))};

それははるかにきれいです。

于 2012-08-27T14:26:35.053 に答える