2017-06-28 6 views
2

コードの2枚があります:句2の出力は2である理由Object.create()とプロトタイプチェーンに関するいくつかの問題?

var obj1 = {name:'one'}; 
obj2 = Object.create(obj1); 
obj2.name = 'two'; 
console.log(obj1.name);     //one 


var obj1 = {prop:{name:'one'}}; 
obj2 = Object.create(obj1); 
obj2.prop.name = 'two'; 
console.log(obj1.prop.name);   //two 

は?

+0

obj1を** obj2の**プロトタイプ**に設定しました'、それが理由です! – adeneo

+0

obj2.propはプロトタイプに解決されます。その名前を設定すると編集されます。 –

答えて

0

基本的には、obj1をプロトタイプとして使用しています。それが使用されると、浅いオブジェクトのコピーを行います。これは、トップレベルが異なることを意味します(つまり、obj2.propを変更した場合はobj1.propには影響しませんが、下位レベルは同じものへの参照なので、変更すると物が変更されます)

同じですObject.assign()て:あなたは何かを複数のレベルダウンとそれを変更しないようにしたい場合は

// Shallow-copy of one level, don't affect each other 
 
const obj1 = { a: 1 }; 
 
const obj2 = Object.assign({}, obj1); 
 
obj2.a = 2; 
 
console.log(obj1.a, obj2.a); 
 

 
// Shallow-copy, change top-level, don't affect each other 
 
const obj3 = { a: { b: 1 } }; 
 
const obj4 = Object.assign({}, obj3); 
 
obj4.a = 3; 
 
console.log(obj3.a, obj4.a); 
 

 
// Shallow-copy, change inner object, affects each other 
 
const obj5 = Object.assign({}, obj3); 
 
obj5.a.b = 2; 
 
console.log(obj3.a.b, obj5.a.b);

、あなたは深いコピー/クローンを行う必要があります

(このような関数を実装するライブラリはたくさんありますので、ここでは再実装しません)

関連する問題