객체 생성시 new를 강제할 수 있는 패턴



 자바 스크립트 라이브러리를 사용할 때 new 키워드를 사용하지 않고 객체로 선언하였다고 생각하고 사용할 때가 있다.  이런 오류 때문에 정상적으로 동작하지 않고 디버깅에 많은 시간을 할 애 할 수 있다. 그렇지만 new를 사용하고 객체를 생성하지 않더라도 자체적으로 새로운 객체를 생성해서 반환해 주는 패턴이 있다. 우선 아래 코드를 보고 이해를 돕고자 한다.

<script type="text/javascript">
    //객체로 사용할 함수
    function NewInstance1() {
        this.name = 'name';
        this.age = 0;
    }
 
    //new를 사용해서 객체 생성
    var newObject1 = new NewInstance1();
    console.log(newObject1.name);
 
    //new를 사용하지 않고 객체 생성
    var newObject2 = NewInstance1();
    console.log(newObject2.name);   //에러 발생
</script>

[코드1] 객체 생성 및 사용 예제


 위 코드에서는 일반적인 객체를 선언하고 두번째 코드에서 new를 사용해서 객체의 인스턴스를 생성하여 값을 정상적으로 사용할 수 있었다. 하지만 두번째 객체의 인스턴스 생성시 new를 사용하지 않고 사용하면 에러가 발생하게 된다. Javascript 엔진이 new 키워드를 만들면 안에서 사용하는 this의 범위가 달라지게 하는 특별한 수행 덕분에 발생하는 이유다. 이와 같은 패턴으로 선언되어 있으면 개발자의 실수로 인해 전체 웹 페이지에 영향을 미칠 수 있는 잠재적인 오류가 내재화 되어 있다. 그렇다면 어떻게 하면 실수를 미연에 방지 할 수 있을까. 아래와 같은 패턴으로 실수를 방지 할 수 있다.  아래 코드를 보자.

//객체로 사용할 함수
function NewInstance2() {
    if (!(this instanceof NewInstance2)) {
        return new NewInstance2();
    }
 
    this.name = 'name';
    this.age = 0;
}
 
//new를 사용해서 객체 생성
var newObject3 = new NewInstance2();
console.log(newObject3.name);
 
//new를 사용하지 않고 객체 생성
var newObject4 = NewInstance2();
console.log(newObject4.name);   //에러 발생

[코드2] self 인스턴스 생성 패턴



 위와 같은 코드로 만들어진 객체는 개발자의 실수를 방지할 수 있게 할 수 있을 것이다. 그리고 prototype을 통해 추가된 프로퍼티들을 사용할 수 있는 장점이 있다.



소스 코드 자체에 주석과 직관적인 코딩으로 충분히 파악이 가능할 것으로 예상하므로 별도의 설명을 생략하도록 하겠습니다. 포스트의 내용이 장황한 설명 보다는 주석과 소스코드 자체 만으로도 이해할 수 있도록 하기 위해 노력하였습니다.. 실제 개발에서도 필요한 소스는 단순히 Copy & Paste 만으로도 사용할 수 있습니다. 그리고 주석을 이용해 nDoc이나 별도의 자동 Document 제작 유틸로 API 문서를 만드는 데에도 도움이 되었으면 한다. 
※ DOC에 대한 프로그램 정보 Util link

ing™       


+ Recent posts