본문 바로가기
C++ 200제/코딩 IT 정보

[JavaScript oop] 인스턴스(Instance) 강제로 생성하는 예제

by vicddory 2018. 1. 12.

[JavaScript oop] 인스턴스(Instance) 강제로 생성하는 예제


자바스크립트에서는 일반 함수와 생성자 함수의 구분이 별도로 없으므로, 일반적으로 생성자 함수로 사용할 함수는 첫 글자를 대문자로 표기하는 네이밍 규칙을 권장한다.


그러나 이러한 규칙(Javascript OOP 개념?)을 사용하더라도 결국 new를 사용해서 호출하지 않을 경우 코드의 에러가 발생할 수 있으므로, 더글러스 크락포드와 같은 자바스크립트 전문가들은 객체를 생성(Instance 생성 의미)하는 다음과 같은 별도의 코드 패턴을 사용하기도 한다.


자바스크립트 인스턴스 생성하기[Javascript oop] 인스턴스 생성


앞에서 설명한 위험성을 피하려고 널리 사용되는 패턴이 있다. 다음 예제를 보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
function A(arg) {
    if (!(this instanceof A))
        return new A(arg);
 
    this.value = arg ? arg : 0;
}
 
var a = new A(100);
var b = A(10);
 
console.log(a.value);      // (출력값) 100
console.log(b.value);      // (출력값) 10
console.log(global.value); // (출력값) undefined
cs


함수 A에서는 A가 호출될 때, this가 A의 인스턴스인지를 확인하는 분기문이 추가되었다. this가 A의 인스턴스가 아니라면, new로 호출된 것이 아님을 의미하고, 이 경우 new로 A를 호출하여 반환하게 하였다.


javascript oop 인스턴스 생성[JavaScript oop] 인스턴스(Instance) 강제로 생성하는 예제


이렇게 하면 var b = A(10);과 같이 사용자가 사용했다고 하더라도, 전역 객체에 접근하지 않고, 새 인스턴스가 생성되어 b에 반환될 것이다.


NOTE_ 어떤 코드에서는 앞과 같이 함수의 이름을 그대로 쓰지 않고 다음과 같이 표현식을 쓰곤 한다.


1
2
3
if (!(this instanceof arguments.callee))
 
...,
cs


arguments.callee가 곧 호출된 함수를 가리킨다. 이와 같이 하면, 특정 함수 이름과 상관없이 이 패턴을 공통으로 사용하는 모듈을 작성할 수 있는 장점이 있다.


이 패턴으로 함수 사용자가 함수 작성자의 의도와는 다르게 함수를 호출할 때에도 문제가 발생하지 않게 한다. 그리고 함수 작성자 역시, 사용자가 new로 반환된 인스턴스를 사용하게 도리 것을 확신하고 자신의 코드를 작성할 수 있다. 이 패턴은 매우 광범위하게 사용된다.


여러분이 알고 있는 대부분의 자바스크립트 라이브러리에 이 패턴이 들어가 있음을 확인할 수 있다.


출처 : 인사이드 자바스크립트


아... 어렵다.

왜 나한테 웹을 맡기지?


[JavaScript oop] 인스턴스(Instance) 강제로 생성하는 예제

댓글