# 중복을 제거하는 방법;팩토리 패턴, 프로토타입

*프로토타입과 참조관계를 통해 공통되는 속성을 수정할 수 있다. 한번에 모두 다!*

*\_proto*\_ *: JS가 객체의 속성을 찾을 때 쓰인다.*

하지만 이것은 비표준이기 때문에 쓰면 안된다!

팩토리패턴과 프로토타입 등은 객체끼리 데이터를 공유할 수 있다는 것을 보여준다.

1. 팩토리 패턴

```javascript
var 프로토타입 = {
    type: '카드',
    attack: function() {},
    defend: function() {},
};
function 카드공장(name,att,hp) {
    var 카드 = {
        name: name,
        att: att,
        hp: hp,
    }
    카드._proto_ = 프로토타입
    return 카드;
}
```

프로토타입이 참조를 하고 있기 때문에 프로토타입.type = '장난감' 으로 하면 프로토타입 객체들의 type이 한번에 다 바뀌어진다.

2\. 프로토타입 : 공통되는 속성이나 데이터를 프로토타입에 담는다. 수정에 용이하기 때문이다.

```javascript
var card = {
    type: '카드',
    name: '제로초',
};
var card2 = {
    type: '카드',
    name: '무',
};
var card3 = {
    type: '카드',
    name: '토',
};
var card30000 = {
    type: '카드',
    name: '자고싶다',
};
```

위와 같은 코드가 있을 때, type을 변경하고자 한다면 같은 형태의 객체를 하나하나 다 바꿔야할 것이다.

```javascript
var 프로토타입 = {
    type: '카드',
    attack: function() {},
    defend: function() {},
};
function 카드공장(name,att,hp) {
    var 카드 = {
        name: name,
        att: att,
        hp: hp,
    }
    카드._proto_ = 프로토타입
    return 카드;
}
```

\_*proto\_ 를 대신하여 Object.create를 사용할 수 있다.*

```javascript
var 프로토타입 = {
    type: '카드',
    attack: function() {},
    defend: function() {},
};
Object.create(프로토타입);

```

Object.keys와 forEach문을 사용하여 객체를 복사할 때 Object.assign을 사용하여 줄일 수 있다. (1단계 복사할 때 사용)

```javascript
Object.keys(obj).forEach(function (key) {
    obj[key] = obj[key]
});

Object.assign(obj2,obj);

```

&#x20;
