[Javascript] 생성자 패턴을 팩토리 패턴과 비교해서 알아보기
생성자/인스턴스?
객체지향 프로그래밍입니다.
객체를 생성하는 함수를 생성자(constructor) 함수라고 부릅니다.
함수 이름 첫 글자를 대문자로 표기하는 것이 규칙입니다.
this, new를 사용합니다.
new를 이용하여 함수처럼 호출합니다.
생성자 함수가 다른 언어의 class의 역할을 대신합니다.
팩토리 패턴?
우선 아래와 같이 팩토리 패턴과 Object.create()를 이용하여
프로토 타입을 적용한 패턴 예제를 먼저 보겠습니다.
let prototype = {
type: 'friend',
personality: function() {
console.log('nice');
}
}
function friendMaker(name, age, job, sex) {
let friend = Object.create(prototype);
friend.name = name;
friend.age = age;
friend.job = job;
friend.sex = sex;
return friend;
}
friendMaker('박지수', 30, 'nurse', 'female');
결과는?
{name: "박지수", age: 30, job: "nurse", sex: "female"}
age: 30
job: "nurse"
name: "박지수"
sex: "female"
__proto__:
personality: ƒ ()
type: "friend"
__proto__: Object
생성자 패턴
예제
let prototype = {
type: 'friend'
}
function FriendMaker(name, age, job, sex) {
this.name = name; //this
this.age = age;
this.job = job;
this.sex = sex;
}
FriendMaker.prototype = prototype;
new FriendMaker('박지수', 30, 'nurse', 'female'); //new
//new를 붙이는 순간 FriendMaker 객체가 생성 된다.
결과는?
FriendMaker {name: "박지수", age: 30, job: "nurse", sex: "female"}
age: 30
job: "nurse"
name: "박지수"
sex: "female"
__proto__:
type: "friend"
__proto__: Object
PROTO 타입 적용 형식
*팩토리 패턴
변수.__proto__ = 프로토타입 변수
*생성자 패턴
함수이름.prototype = prototype;
this
this는 기본적으로 window가 됩니다.
this는 함수를 호출할때 결정이 됩니다.
this가 window에서 바뀌는 경우
객체가 메서드처럼 사용될 때 this가 window에서 객체 자신으로 바뀝니다
화살표 함수에서는 this가 바뀌지 않고 무조건 부모의 this를 받아옵니다.
new(생성자)가 적용될때 this가 window에서 생성자 함수 자신을 가리키고
(this가 window -> 함수 자신으로 바뀌게 됨)
this에 저장된 것들은 new를 통해 객체를 생성할 때 그 객체에 적용됩니다.
예제(1 ) 객체가 메서드처럼 사용될때 - 함수 앞에 객체가 붙을때
const obj = {
name: 'goddino',
sayName() {
console.log(this.name);
}
};
obj.sayName(); //sayName 함수 앞에 obj이라는 객체가 붙을 때 this는 obj 객체가 됨
//goddino
예제(2)- 화살표 함수
const obj = {
name: 'goddino',
sayName : () => { //화살표 함수
console.log(this.name);
}
};
obj.sayName() //객체가 함수 앞에 있더라구도 함수가 화살표 함수면 this는 windwo
//결과 값이 window.name 이므로 아무것도 나오지 않음
예제(3)
const obj = {
name: 'goddino',
sayName() {
console.log(this.name); //결과 goddino - obj.sayName() 이므로 this가 obj로 바뀜
function inner() {
console.log(this.name); //결과 window.name 이므로 없음 inner()가 this가 window에서 안바뀜
}
inner(); //this가 안바뀜
}
};
obj.sayName() //this가 바뀜
예제(4)
항상 함수를 호출할때 this를 보게되고
inner() 에서는 this를 바꾸지 않습니다.
() => {} 화살표 함수에서 부모 함수의 this를 가져오고
부모 함수는 sayName, sayName의 this는 sayName() 으로 호출하였기 때문에 goddino 가 되고
goddino를 그대로 따름
const obj = {
name: 'goddino',
sayName () {
console.log(this.name); //goddino
const inner = () => {
console.log(this.name); //goddino
}
inner();
}
};
obj.sayName()
함수 종류 별 this
this는 함수 호출할 때 정해집니다.
일반 함수(function () { })는 호출 위치에 따라 this 정의
화살표 함수(() => { })는 자신이 선언된 함수 범위에서 this 정의
this 예제
new라는 키워드 User라는 생성자 함수를 Goddino라는 인수를 넣어 생성하여
goddino라는 인스턴스를 만들어 줍니다.
normal 메소드가 실행되는 호출되는 위치에 연결되어있는 객체, Goddino가 this 키워드가 됩니다.
arrow 메소드는 자신이 선언된 함수 범위가 없기 때문에 undefined가 됩니다.
function User(name) { //User라는 생성자 함수
this.name = name;
}
User.prototype.normal = function() { //normal 메소드(일반 함수)
console.log('normal', this.name);
}
User.prototype.arrow = () => { //arrow 메소드(화살표 함수)
console.log('arrow', this.name);
}
const goddino = new User('Goddino'); //goddino 인스턴스 = new User('Goddino'); Goddino 인수
goddino.normal(); //결과: normal Goddino
goddino.arrow(); //결과: arrow undefined
'돈 버는 방법 > IT 정보' 카테고리의 다른 글
[사전예약] 갤럭시Z플립4 자급제 사전예약 신청, 가격, 혜택, 사은품 모두 알아보기 (0) | 2022.08.16 |
---|---|
[Javascript] react의 useReducer 사용법 알아보기 (0) | 2022.08.12 |
[Javascript] 자바스크립트 스코프, 클로저(ft. 지역/글로벌/렉시컬 scope) 알아보기 (0) | 2022.08.12 |
[갤럭시Z플립4] 드디어 나왔다 뭐가 달라졌는지 알아볼까? (0) | 2022.08.12 |
아직도 통신비 많이 내시는거에요? 최저 0원부터 5천원미만 초저가가성비 알뜰폰 요금제 알아보기 - LGU+ 통신망 (0) | 2022.08.03 |