2017-11-21 13 views
0

나는 뭔가 잘못하고 있어야합니다.ES6 업데이트 된 복제 속성이 원본에 영향을 미치지 않는지 확인하는 방법?

    이름 밥 이름으로 새로운 VAR 앨리스
  1. 이름 바꾸기 앨리스 밥 &의 '앨리스'
  2. 로그인 이름과 같은 '밥'
  3. 복제 밥 앨리스
  4. 인스턴스화 Person 클래스

나는 Bob의 이름이 'Bob'으로 남아있을 것이라고 기대하지만, Bob을 업데이트하지는 않았지만 'Alice'로 업데이트되었습니다 ...? 사전에

class Person { 
 
    constructor(attr) { 
 
    this.attr = attr; 
 
    } 
 

 
    talk() { 
 
    console.log('My name is ' + this.attr.name); 
 
    } 
 
} 
 

 
function clone(obj) { 
 
    return Object.assign(Object.create(Object.getPrototypeOf(obj)), obj); 
 
} 
 

 
var Bob = new Person({ 
 
    name: 'Bob' 
 
}); 
 

 
var Alice = clone(Bob); 
 
Alice.attr.name = 'Alice'; 
 

 
Alice.talk(); 
 
Bob.talk();

감사합니다.

+0

어떻게 개체를 복제하는 :

var a = {name: 'a', exec: function() {return true;}}; var b = JSON.parse(JSON.stringify(a)); console.log(b); // {name: 'a'} 

는 복제에 더 나은 통찰력을 위해, 당신은이 문서를 참조 할 수 있습니다? – Intervalia

+0

'Bob'만 복제했습니다. 당신은'attr' 객체를 복제하지 않았습니다. 중첩 된 객체가 아닌 객체 자체에 값을 저장하십시오! – Bergi

답변

2

Object.assign 얕은 복사를 수행하므로 BobAliceattr 참조 자신의 복사본을 가지고 것입니다,하지만 그들은 같은 중첩 된 객체를 참조하십시오. attr.name은 여전히 ​​공유 문자열입니다.

var cloned = JSON.parse(JSON.stringify(objectToClone)); 

그러나 캐치이에있다 :

Alice.attr = { name: 'Alice' }; 
+0

이 통찰력은 완벽합니다. 고맙습니다! – blindmikey

+0

부모와 같은 참조, 순환 참조 또는 함수, 부작용이있는 getter 등이있을 수있는 사용자 정의 된 객체는 복제가 모호합니다. 예를 들어 [이 클론 질문에 대한 답변] (https://stackoverflow.com/questions/4459928/how-to-deep-clone-in-javascript/40294058#40294058)을 참조하십시오. – trincot

1

복제에 대한 간단한 해결 방법은 다음과 같습니다

당신은 attr 속성을 재 할당 다른 깊은 (어) 복사를 수행하거나 필요 솔루션의 경우 객체의 속성 값이 함수 일 때 실패합니다. deep cloning