2011-12-26 10 views
1

Javascriptは、文字通りではなく参照によってオブジェクトをコピーします。たとえば、次のように参照によってオブジェクトをコピーするのに実際的な用途はありますか?

var myObject = {}; 
var myCopy = myObject; 

myObject.foo = "bar"; 

alert(myCopy.foo); //alerts "bar" 

しかし、私は本当にあなたが同じオブジェクトに異なる名前の異なる用途を与えることができて(コードは少し読みやすくするために、開発者に道を与えるよりも、この他のための実用的な、現実世界の理由を考えるのに苦労しています)。

私はポイントを見逃しているので、誰でもそのポイントが何であるか教えていただけますか?

+2

この動作には「コピー」という言葉はまったく使用されません。同じオブジェクトへの参照を2つの変数に代入するだけです。 2つの変数に番号5を割り当てることと変わりはありません。私はあなたがそのような課題を*不可能にするための言葉で何をするのか想像できません。 – Pointy

答えて

4

書き込み後:

var myObject = {}; 

オブジェクトを使用すると、名前myObjectで参照できることをどこかのメモリにそこにあります。次の代入:

var myCopy = myObject; 

... myCopyは今それがかもしれどこが同じオブジェクトを指し、と述べています。これは、関数に引数を与えたときの動作と同じものです:

function somefunc(localName) { 
    // body 
} 
someFunc(myCopy); 

は今も記憶にその同じオブジェクトを指してローカルにsomeFuncあるlocalNameという変数があります。

これは、オブジェクトへの参照を渡す基本的な方法であるため、異なるスコープで異なる名前で参照することができます。

は、構造全体をメモリ内の新しい場所にコピーできます。デザイナーがそのような言語を作成するのを止めることは何もなかった。しかし、それはあまり効率的ではありません - 深くネストされたオブジェクトを考え、一般的にあなたがしたいことではありません。たとえば、ある関数がオブジェクトの1つのプロパティを変更した場合、その変更がその関数の外で持続するようにオブジェクト全体を返す必要があります。そして、呼び出し元は、古いオブジェクトを保持する必要があるかどうか、または新しく作成されたわずかに異なるコピーがそれを上書きできるかどうかを判断して、その戻り値を処理する必要があります。

この場合も、原則としてこの設計方向に問題はありません。それはJavaScriptがどのように設計されたかではありません。

1

これは依存します。あなたのケースでは、実際の目的に役立たないので、むしろ混乱するかもしれません。

var style = document.getElementById("foo").style; 

style.color = "red"; 
style.font = "sans-serif"; 
// ... 
0

(私の意見:それは、このような本例のように、オブジェクトを使用する各ステートメントのより少ない入力を必要とするためしかし、オブジェクトへのより長い経路のためには、別々の変数にオブジェクトを格納するために有利であり得ますそれ以外の何ものでもありません)は、コピーではなく参照によってオブジェクトを作成する方が、一般的にはより便利で、ユーザーが望むものです。メソッドにパラメータを渡してオブジェクトを渡すと、(ほとんどの場合)元のままにしておくことで、コピーを処理するのではなく、そのメソッドによって変更されたオブジェクトに関心があります。明らかに、これが真実ではない状況があり、選択肢があるのは良いことですが、オブジェクトコピーをメソッドに渡すことができたら大変感謝しています。私が働いていることは事であるということ。

関連する問題