JavaScript의 팩토리 함수와 생성자 함수
객체를 하나씩 생성하는 것은 잘못된 방식입니다.
만약 100명의 반 친구들이 있고 각 친구를 위한 객체를 만들어야 한다면, 개별적으로 객체를 작성하는 것은 문제를 일으킵니다. 로직을 너무 여러 번 반복하게 되며, 버그가 발생할 위험도 있습니다. 예를 들어, 나중에 코드에서 실수로 속성 이름을 덮어쓸 수도 있습니다.
로직을 재사용할 수 있는 더 나은 방법이 필요합니다.
팩토리 함수 (Factory Functions)
공장을 떠올려 보세요. 원재료를 넣으면 완제품이 나옵니다. 팩토리 함수도 마찬가지입니다. 매개변수를 받아 새로운 객체를 반환합니다.
예시:
function classFactory(name) {
return {
reply() {
return `${name} is present`
}
}
}
이 방식은 name을 안전하게 보호합니다. name이 함수 스코프 내부에 머물기 때문에 실수로 이름을 변경할 수 없습니다. 로직을 한 번만 작성하고 여러 번 재사용할 수 있습니다.
생성자 함수 (Constructor Functions)
생성자 함수 또한 객체를 생성합니다. 이 함수들은 this 키워드와 new 키워드를 사용합니다. 관례적으로 이러한 함수들은 대문자로 시작합니다.
예시:
function Classmate(name) {
this.name = name
this.reply = function() {
return `${this.name} is present`
}
}
new 키워드를 사용하면 JavaScript가 대신 작업을 수행합니다. 새로운 객체를 생성하고, 이를 this에 할당한 뒤 자동으로 반환합니다. 별도의 return 문이 필요하지 않습니다.
코드 확장하기 (Scaling your code)
이러한 메서드들을 배열과 결합하여 대량의 데이터를 처리할 수 있습니다.
const names = ['Kali', 'Andrew', 'Pearl', 'Percy']
const classmates = names.map(name => new Classmate(name))
classmates.forEach(c => console.log(c.reply()))
이를 통해 코드를 깔끔하고 확장 가능하게 만들 수 있습니다.
주요 목표는 간단합니다:
- 로직을 한 번만 작성합니다.
- 어디서든 재사용합니다.
- 반복을 피합니다.
출처: https://dev.to/pearlodi/factory-functions-and-constructor-functions-in-javascript-lmb