2017-01-04 4 views
16

ES6을 사용하여 Javascript 클래스 인스턴스를 복제하는 방법은 무엇입니까?자바 스크립트 ES6 클래스 인스턴스를 복제하는 방법

저는 jquery 또는 $ extend를 기반으로하는 솔루션에 관심이 없습니다.

나는 객체 복제에 대한 꽤 오래된 논의를 보아서 문제가 복잡하다는 것을 알았지 만 ES6에서는 매우 간단한 해결책이 제시됩니다. 나는 그것을 아래에두고 사람들이 그것이 만족 스럽다고 생각하는지 봅니다.

편집 : 내 질문이 중복임을 제안합니다. 저는 그 대답을 보았습니다 만 7 살이었고 ES6 이전의 js를 사용하여 매우 복잡한 대답을했습니다. 나는 ES6을 허용하는 나의 질문에 극적으로 간단한 해결책이 있음을 제안하고있다.

+2

스택 오버플로에 대한 이전 질문에 대한 새로운 대답이있는 경우 원래 질문에 해당 답변을 추가하십시오. 새 질문을 만드십시오. –

+1

ES6 클래스 인스턴스가 "일반"객체와 다르게 작동하기 때문에 Tom이/직면했던 문제를 봅니다. – CreasolDev

+2

또한 ES6 클래스 인스턴스를 통해 실행하려고하면 "가능한 복제본"이 실제로 충돌을 일으키는 것으로 대답 한 코드의 첫 번째 부분이 – CreasolDev

답변

2
const clone = Object.assign({}, instanceOfBlah); 
Object.setPrototypeOf(clone, Blah.prototype); 

Object.assign의 특성 : 그것은 얕은 사본을 수행하고 클래스 메소드를 복사하지 않습니다.

복사에 대한 자세한 복사 또는 더 많은 제어를 원한다면 lodash clone functions이 있습니다.

+2

'Object.create'는 지정된 프로토 타입으로 새로운 객체를 생성하기 때문에'const clone = Object.assign (Object.create (instanceOfBlah), instanceOfBlah)'만 해보십시오. 또한 클래스 메서드도 복사됩니다. – barbatus

+0

@barbatus 저기, 틀린 프로토 타입을 사용합니다. 'Blah.prototype! = instanceOfBlah'. 당신은'Object.getPrototypeOf (instanceOfBlah)'를 사용해야합니다. – Bergi

+0

@Bergi no, ES6 클래스 인스턴스는 항상 프로토 타입이있는 것은 아닙니다. https://codepen.io/techniq/pen/qdZeZm에서 인스턴스와 함께 작동하는지 확인하십시오. – barbatus

16
let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig) 

나는 결국 많은 노력을했습니다.

they say 코드가 많이 느려지므로 프로토 타입을 설정하지 않아도됩니다.

그리고 한 줄짜리입니다!

+0

정적 메서드는 실제로 열거 가능한 속성이 아니기 때문에 정적 메서드를 복사하지 않습니다. –

+0

@ Mr.Lavalamp 어떻게 정적 메서드를 복사 할 수 있습니까? – flori