본문 바로가기

JavaScript

팩토리 패턴, 프로토타입

반응형

🔷 팩토리 패턴

 

function 카드공장 (name, att, hp){
    return{
        name:name,
        att:att,
        hp:hp,
        type:'카드',
        attack:function(){},
        defend:function(){},
    };
}

let card = 카드공장('토끼',10,10);

card
//{name: "토끼", att: 10, hp: 10, type: "카드", attack: ƒ, …}
//att: 10
//attack: ƒ ()
//defend: ƒ ()
//hp: 10
//name: "토끼"
//type: "카드"
//__proto__: Object

let card2 = 카드공장('거북이',20,20);

card2
//{name: "거북이", att: 20, hp: 20, type: "카드", attack: ƒ, …}
//att: 20
//attack: ƒ ()
//defend: ƒ ()
//hp: 20
//name: "거북이"
//type: "카드"
//__proto__: Object

 

🔶 프로토타입

 

let prototype = {
    type:'카드',
    attack:function(){},
    defend:function(){},
}

let card = {
    name : "토끼",
    att: 10,
    hp:10,
}

card.__proro__ = prototype;
//{type: "카드", attack: ƒ, defend: ƒ}
//attack: ƒ ()
//defend: ƒ ()
//type: "카드"
//__proto__: Object

card
//{name: "토끼", att: 10, hp: 10, __proro__: {…}}
//att: 10
//hp: 10
//name: "토끼"
//__proro__: {type: "카드", attack: ƒ, defend: ƒ}
//__proto__: Object

 

- 프로토타입은 접근할때

card.__proto__.type  card.type "__proto__"는 생략이 가능하다.

 

 

 

🔶🔷 팩토리패턴 내 프로토타입

 

function 카드공장 (name, att, hp){
   let 객체 ={
       name:name,
       att:att,
       hp:hp,
   }
    객체.__proto__= {
       type:'카드',
       attack:function(){},
       defend:function(){},
    }
    return 객체;
}

let card2 = 카드공장("여우",10,10);

card2
//{name: "여우", att: 10, hp: 10}
//att: 10
//hp: 10
//name: "여우"
//__proto__:
//attack: ƒ ()
//defend: ƒ ()
//type: "카드"
//__proto__: Object

 

 

프로토타입을 쓰는 이유

 

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

let card1 =카드공장('토끼');

card1
//{name: "토끼", att: undefined, hp: undefined}att: undefinedhp: undefinedname: "토끼"__proto__: attack: ƒ ()defend: ƒ ()type: "카드"__proto__: Object

card1.type
//"카드"

프로토타입.type = "장난감"
//"장난감"

card1.type
//"장난감"

 

- card마다 type을 변경하지말고, 프로토타입의 type을 장난감으로 한번만 수정하여 모든 card의 type이 변경될 수 있도록

 

 

항목을 하나 더 추가할 경우!

 

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

let card2 = 카드공장('마우스',20,20);

card2
//{name: "마우스", att: 20, hp: 20}
//att: 20
//hp: 20
//name: "마우스"
//__proto__:
//attack: ƒ ()
//defend: ƒ ()
//type: "카드"
//__proto__: Object

프로토타입.width = 200;

card2
//{name: "마우스", att: 20, hp: 20}
//att: 20
//hp: 20
//name: "마우스"
//__proto__:
//attack: ƒ ()
//defend: ƒ ()
//type: "카드"
//width: 200
//__proto__: Object

 

- 프로토타입에 width를 추가했는데 card2에도 width가 추가된 것을 확인할 수 있다.

'JavaScript' 카테고리의 다른 글

2048 | ZeroCho  (0) 2020.10.22
call by value, 생성자  (0) 2020.10.20
참조와 복사의 차이, 사용법  (0) 2020.10.18
카드 짝 맞추기 게임 | ZeroCho  (0) 2020.10.18
지뢰찾기 | ZeroCho  (0) 2020.10.13