2011-11-10 9 views
2

はおそらく、すでに他の場所で答えていたと私はちょうど明らかに他のソリューション...または一般にはJavaScriptを理解していないです。Javascriptの継承問題

私の質問です、なぜ代わりに「TEST1」の(http://jsfiddle.net/Se9ZW/2/)印刷「TEST5」以下のコード?

var fake = { value:'test1'}; 
var fake2=fake; 
fake2.value='test5'; 
document.getElementById('debug').innerHTML=fake.value; 

これらはかなり明白であるので、私はちょっとでもそれを育てることが恥ずかしいのですが、私はyaは何とか学ぶなきゃと思い、何かのように思えます。

+0

こちらを参照してください。http://stackoverflow.com/questions/728360/copying-an-object-in-javascript – Irishka

答えて

4

fakefake2は同じオブジェクトへの参照です。したがって、それらの動作が完全に予想されます。 これは継承とは関係ありません。

あなたが継承したい場合は今、1つの方法は、(かなりナイーブ、私は加えるかもしれない)、このようにそれを行うには、次のようになります。

var fake = { value:'test1'}; 
var fake2 = Object.create(fake); //creates a new object with fake as prototype 
fake2.value = 'test5'; // "overrides" the value property from the prototype 
console.log(fake.value); 

、出力は次のようになります。

test1 

これはECMAScript Edition 5からのものであり、これはかなり最近のものであり、そこにあるすべてのJavaScriptエンジン実装では動作しない可能性があります。

JavaScriptで継承を実装/使用する方法はいくつかあります。私は説明の1つにあなたを紹介するつもりですin accepted answer here

+0

ブリリアント。それは完全に意味を成しています、私は以前に何かに遭遇したことはありませんでした。 – malonso

1

var fake2 = fake; 

がfake2に偽の参照を作成するためです。 fake2で何かを変更すると、偽も変更されます。

0

javascriptは参照渡しであるため、fake2は偽のコピーではないことを意味します。つまり、偽の別の名前であり、実際は同じオブジェクトです。

1

用語が混乱するかもしれませんか?ここでは、 "参照"と "値"という言葉のない説明があります:

{ value:'test1'}はオブジェクトです。あなたは物事でいっぱいのバケツのように考えることができます。この場合、バケットには名前付き値の中に1つのものがあります。

オンライン1では、偽をバケットに向けています。 2行目では、fake2が偽造されていると指摘しています。偽はバケットを指しているだけなので、fake2もまったく同じバケットを指しています。 3行目の

fake2.valueはバケツにvalueという名前のものです。 fake2.valueは同じバケット内で同じものです。

これと同じことが、プリミティブが(と思う:具体的な事を)ということであると言うするもう一つの方法は、値によって渡され、オブジェクトが(と思う:コンテナおよび/またはバケット)JavaScriptで参照によって渡されます。

+1

私は、おそらく、何かがJavaScriptで参照によって渡されたと主張することを控えるでしょう...それは価値によって渡される参照です。 – ZenMaster

+0

+1良い点、ZenMaster – Upgradingdave