// 복제 메서드 선언
// 필요하ㅣ다면 인터페이스를 통해 복제 메서드들을 먼저 선언해줘도 됨
class Prototype {
public primitive: any;
public component: object;
public circularReference: ComponentWithBackReference;
// Object.create() 메서드를 통해 이전 객체의 필드값, 즉 자바스크립트의 프로토타입 전달 가능
public clone(): this {
const clone = Object.create(this);
// 각각의 속성들에 대해서도 프로토타입 지정
clone.component = Object.create(this.component);
clone.circularReference = {
...this.circularReference,
prototype: { ...this },
};
return clone;
}
}
// 정의된 프로토타입을 받는 또다른 클래스
class ComponentWithBackReference {
public prototype;
constructor(prototype: Prototype) {
this.prototype = prototype;
}
}
//클라이언트 코드
function clientCode() {
const p1 = new Prototype();
p1.primitive = 245;
p1.component = new Date();
p1.circularReference = new ComponentWithBackReference(p1);
//p2는 p1을 프로토타입을 통해 복제함
const p2 = p1.clone();
if (p1.primitive === p2.primitive) {
console.log('Primitive field values have been carried over to a clone. Yay!');
} else {
console.log('Primitive field values have not been copied. Booo!');
}
if (p1.component === p2.component) {
console.log('Simple component has not been cloned. Booo!');
} else {
console.log('Simple component has been cloned. Yay!');
}
if (p1.circularReference === p2.circularReference) {
console.log('Component with back reference has not been cloned. Booo!');
} else {
console.log('Component with back reference has been cloned. Yay!');
}
if (p1.circularReference.prototype === p2.circularReference.prototype) {
console.log('Component with back reference is linked to original object. Booo!');
} else {
console.log('Component with back reference is linked to the clone. Yay!');
}
}
clientCode();
/*
Primitive field values have been carried over to a clone. Yay!
Simple component has been cloned. Yay!
Component with back reference has been cloned. Yay!
Component with back reference is linked to the clone. Yay!
*/
복사해야 하는 객체들의 구상 클래스에 코드가 의존하면 안될 때 사용
코드가 인터페이스를 통해 다른 모르는 객체들과 함께 작동할 때 둘을 분리하기 위해 사용
클라이언트 코드가 복제하는 객체들의 구상 클래스에서 코드를 독립시킴
객체를 초기화하는 방식만 다른 자식 클래스의 수를 줄이고 싶일 때 사용
다양한 설정으로 미리 만들어진 객체들의 집합을 프로토타입으로 사용해 자식 클래스를 인스턴스화 하지 않고 프로토타입 복제로 문제 해결 가능