본문 바로가기

Dev-/java script, jQuery, Ajax

자바스크립트 생성자 함수 패턴(생성자 강제)

참고) 자바스크립트 객체 생성방법 new Object() vs 객체 리터럴({}) vs 생성자 함수



위 글에서 생성자 함수의 오류 가능성에 대해 이야기 했는데,

이를 방지하기 위한 패턴이 있다.


간단히 아래 사실을 이용해 강제한다.


this가 무엇을 가리키다?

- new를 붙여 함수 사용시 : 함수 객체 자신

- 그냥 사용시: window


let Human = function(name) {
if (!(this instanceof Human))
return new Human(name ? name : 0);

this.name = name ? name : 0;
};


/** 아래와 같이 new를 안붙여도 생성자로 사용된다 */
let human = Human('hoon');
console.log(human);




쪼금 더 좋은 방법

argument 프로퍼티의 callee프로퍼티를 사용한다. (매개변수를 호출한 객체) -> 즉 함수의 이름과 상관없음

let Human = function CustomName(name) {
if (!(this instanceof arguments.callee))
return new arguments.callee(name ? name : 0);

this.name = name ? name : 0;
};

let human = Human('hoon');
console.log(human);