2011-01-11 4 views
4

私はjavascriptで変数の参照を与えたい。どのように変数のリファレンスをjavascriptで与えますか?

a=1 
b=a 
a=2 

aとb = 2を持っており、それに応じて変更します。

は例えば、私がやりたいです。

これはjavascriptで可能ですか? a.onchange = function(){b = a}のようにする方法がない場合は?私がやりたいこと

は、オブジェクトを作るmakeobjectのような関数を作成しましたので、私は

a=makeobject() 
b=makeobject() 
c=makeobject() 

を行う可能性がより

function makeobject() { 
    objects[objects.length] = {blah:'whatever',foo:8}; 
    } 

みたい配列に戻りよりも、それを置くと、後のコードで

for (i in objects) { 
    objects[i].blah = 'whatev'; 
} 

を行い、また、b及びcの値を変更

答えて

5

ほとんどのブラウザでうまく機能する新しいオブジェクトリテラル構文を使用して、これを取り除くことができます。

var o = { 
    _a : null, 
    get a() { return this._a; }, 
    set a(v) { this._a = v; }, 
    get b() { return this._a; }, 
    set b(v) { this._a = v; } 
}; 

o.a = 2; 
o.b = 3; 
o.a = 4; 
alert(o.b); // alerts 4 

また、独自の参照オブジェクトを作成することもできます。

function Ref(obj, name, otherName) { 
    this.obj = obj; 
    this.name = name; 
    this.otherName = otherName; 
} 

Ref.prototype.assign = function (v) { 
    this.obj[this.name] = this.obj[this.otherName] = v; 
} 

var o = { 
    a : 1, 
    b : 4 
}; 

var ref = new Ref(o, 'a', 'b'); 
ref.assign(3); 

alert(o.b); 
+0

+1セッター/ゲッターの新しいサポートを表示します。 –

0

これはできません。

あなたは何をしようとしていますか?
私たちはあなたにJavascript-yのやり方を見つけることができます。

+0

特別な理由はありますか?これがなぜなのか少し分かりますか? – templatetypedef

+1

@templatetypedef JavaScriptでの割り当ては、常に「スロット」(変数またはプロパティ)*への*値のコピーです。 (JSオブジェクトの値は常に自分自身を表しています。Java用語を考えても、「オブジェクトへの参照」自体が単なる値です)。 –

+0

その理由は、変数を作成して後ですべての値を同時に変更できるからです。私は質問に追加しました – Eric

2

これは可能です。ただし、オブジェクトを使用する必要があるだろう:

var a = new Object(); 
a.val = 6; 

alert(a.val); 

var b = a; 
b.val = 5; 

alert(a.val); 

編集:私は(答えはすでにマークされていたにもかかわらず)別の代替で遊んで、そしてここで別のソリューションですした

function makeobj() 
{ 
    if(typeof makeobj.baseobj === 'undefined') 
    { 
     makeobj.baseobj = { 'blah': 'whatever', 'foo': 8 }; 
    } 
    return makeobj.baseobj; 
} 

var a = makeobj(); 
var b = makeobj(); 
var c = makeobj(); 

alert(a['blah']); 
alert(b['blah']); 
alert(c['blah']); 

b['blah'] = 'i changed the value'; 

alert(a['blah']); 
alert(b['blah']); 
alert(c['blah']); 

代替ソリューションはnオブジェクトを作成し、必要に応じて値を変更し、makeobj()関数で作成された他の変数に変更を反映させることができます。

+2

これは当てはまりません。 *すべてがJS *の値で渡され、割り当てられます。申し訳ありません:-)上記の "値渡し"ステートメントには、 "コピー/複製/複製"の記述はありません。オブジェクト*は*そのものであり、変数はオブジェクトの一時的な名前*です。しかし、*オブジェクトが突然変異して*どのようにポストが求めていたのと同様の効果を得るかを示す+1。 –

+0

私はECMA仕様でもう少し調べてみる必要があります(もし私が良い情報源を見つけることができれば)。+1 –

+0

少しのニックピック、 'typeof makeobj.baseobj === 'undefined''は、' undefined' pre-ECMAScript5をチェックするときには良いルートです。 – ChaosPandion

関連する問題