[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] 인스턴스(Instance) 강제로 생성하는 예제
이렇게 하면 var b = A(10);과 같이 사용자가 사용했다고 하더라도, 전역 객체에 접근하지 않고, 새 인스턴스가 생성되어 b에 반환될 것이다.
NOTE_ 어떤 코드에서는 앞과 같이 함수의 이름을 그대로 쓰지 않고 다음과 같이 표현식을 쓰곤 한다.
1 2 3 | if (!(this instanceof arguments.callee)) ..., | cs |
arguments.callee가 곧 호출된 함수를 가리킨다. 이와 같이 하면, 특정 함수 이름과 상관없이 이 패턴을 공통으로 사용하는 모듈을 작성할 수 있는 장점이 있다.
이 패턴으로 함수 사용자가 함수 작성자의 의도와는 다르게 함수를 호출할 때에도 문제가 발생하지 않게 한다. 그리고 함수 작성자 역시, 사용자가 new로 반환된 인스턴스를 사용하게 도리 것을 확신하고 자신의 코드를 작성할 수 있다. 이 패턴은 매우 광범위하게 사용된다.
여러분이 알고 있는 대부분의 자바스크립트 라이브러리에 이 패턴이 들어가 있음을 확인할 수 있다.
출처 : 인사이드 자바스크립트
아... 어렵다.
왜 나한테 웹을 맡기지?
[JavaScript oop] 인스턴스(Instance) 강제로 생성하는 예제
댓글