Self-invoking constructor 패턴
자바스크립트에서는 new 키워드를 생략하더라도 생성자 함수를 일반 함수인 것처럼 호출하고 실행하므로 오류는 발생하지 않고 오동작만 하게 됩니다. 이러한 경우는 작은 오타라서 소스가 많아지면 오류 찾기가 힘듭니다. Self-invoking constructor 패턴은 이러한 실수를 고려하여 생성자를 그냥 함수로 호출할 때 스스로 new를 붙여서 호출하는 패턴입니다.
ECMAScript 6에서 class 키워드가 별도로 나오면서 function 기반으로 객체지향을 개발하는 상황은 점점 줄어들고 있지만, 아직 ECMAScript 6의 class 키워드를 모든 브라우저가 100% 지원하지는 않고 있습니다. 따라서 function으로 객체지향을 구현할 때 방어적으로 이 패턴을 이용하여 생성자 호출 실수를 처리하면 좋습니다. 이러한 실수가 나오는 이유는 자바스크립트가 자료형에 대한 제약이 없어서 타입이 다르거나 함수에 반환값이 없어도 오류를 내지 않고 undefined 등으로 처리하기 때문입니다.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
(function () {
function Employee_A(name, manMonth) {
this.name = name;
this.manMonth = manMonth;
}
function Employee_B(name, manMonth) {
// Self-invoking constructor 패턴 : new 없이 호출된 경우 new로 재호출 되도록 하는 패턴
if (!(this instanceof Employee_B)) {
return new Employee_B(name, manMonth);
}
this.name = name;
this.manMonth = manMonth;
}
let simuing_A = Employee_A("Simuing_A", 1),
world_A = new Employee_A("World_A", 2);
console.log("객체 생성 테스트 A");
console.log(simuing_A); //==>> undefined
console.log(world_A); //==>> Employee_A
let simuing_B = Employee_B("Simuing_B", 3),
world_B = new Employee_B("World_B", 4);
console.log("객체 생성 테스트 B");
console.log(simuing_B); //==>> Employee_B
console.log(world_B); //==>> Employee_B
}());
</script>
</body>
</html>
#
참고도서 : 속깊은 자바스크립트
이전글 :
2021/02/10 - [Study Note/Javascript] - javascript #디자인패턴 - 폼 검증을 위한 데커레이터 패턴(decorator pattern)
2021/02/10 - [Study Note/Javascript] - javascript #디자인패턴 - 객체 기반 데커레이터 패턴(decorator pattern)
2021/02/10 - [Study Note/Javascript] - javascript #디자인패턴 - 함수 기반 데커레이터 패턴(decorator pattern)
2021/02/10 - [Study Note/Javascript] - javascript #디자인패턴 - Init-time branching 패턴
2021/02/12 - [Study Note/Javascript] - javascript #디자인패턴 - Self-defining function 패턴
2021/02/13 - [Study Note/Javascript] - javascript #디자인패턴 - 메모이제이션 패턴 (memoization pattern)
'Study Note > Javascript' 카테고리의 다른 글
javascript #디자인 패턴 - 커링 패턴(currying pattern) (0) | 2021.02.13 |
---|---|
javascript #디자인패턴 - 콜백 패턴(callback pattern) (0) | 2021.02.13 |
javascript #디자인패턴 - 메모이제이션 패턴 (memoization pattern) (0) | 2021.02.13 |
javascript #디자인패턴 - Self-defining function 패턴 (0) | 2021.02.12 |
javascript #디자인패턴 - Init-time branching 패턴 (0) | 2021.02.10 |
댓글