2017-01-09 21 views
1

ここでは、Object.create()の仕組みを理解するための簡単なコードを用意しています。ここでは、プロトタイプとして使用される共通オブジェクトがprototypeObjです。 newObjは、プロトタイプがprototypeObjに設定されたオブジェクトです。ここで私はanotherObjと呼ばれるプロパティを持つsessionと呼ばれる別のオブジェクトがあり、anotherObjnewObjと同じプロトタイプを持っています。しかし、プロトタイプanotherObjにあるfooというプロパティに新しい値を追加すると、newObjにも影響します。なぜ私はこの行動を経験していますか?javacriptの関数引数としてオブジェクト参照を渡す

コード:

var prototypeObj = { 
 
    foo: [], 
 
    addItemToFoo: function(add) { 
 
    this.foo.push(add); 
 
    } 
 
} 
 

 
function create(fooVal) { 
 
    var myProto = Object.create(prototypeObj); 
 
    myProto.foo = fooVal; 
 
    return myProto; 
 
} 
 

 
var newObj = create([1, 2]); // initialized with [1,2] 
 

 
session = { 
 
    anotherObj: create(newObj.foo) // initialized with [1,2] 
 
} 
 

 
session.anotherObj.addItemToFoo(6); // pushed 6 to session.anotherObj.foo 
 

 
console.log("newObj.foo is " + newObj.foo); // newObj also get 6 pushed to its foo property 
 

 
console.log("anotherObj.foo is " + session.anotherObj.foo);

答えて

1

fooそれが参照することによって動作し、アレイです。

anotherObj: create(newObj.foo) 

あなたはここに参照をコピーしているので、両方の古いと新しいオブジェクトが中に要素を挿入するために同じ配列の参照を持っています。あなたが別の配列参照にしたい場合は、あなたがこのcreate(newObj.foo.slice())ようにそれを最初にコピーする必要があります

https://jsfiddle.net/x8ftnh82/

+0

@ AL-zamiはどうなっていますか? – zurfyx

+0

これは今分かっています... :) –

+1

@ AL-zami great :)これは、例えば整数や文字列では起こり得ないことに注意してください。しかし、 '{something:1}'のような他のオブジェクトでも起こります。 – zurfyx

関連する問題