new를 사용하도록 강제
자바스크립트 언어만으로는 반드시 new를 써서 생성자 함수를 호출하게 할 도리가 없다. 하지만 instanceof 연산자를 써서 우회적으로 강제하는 방법이 있다. new 키워드를 사용하여 Marsupial 생성자 함수를 호출하게 해보자(예제 3-4).
예제 3-4 instanceof 연산자로 new 사용을 강제
소스 파일 3장\New Pattern\newpattern_02.js
function Marsupial(name, nocturnal) { if (!(this instanceof Marsupial)) { throw new Error("이 객체는 new를 사용하여 생성해야 합니다"); } this.name = name; this.isNocturnal = nocturnal; } var slider = Marsupial('슬라이더', true);
Note. instanceof의 작동 원리
예제 3-4와 3-5는 this instanceof Marsupial 결과가 false인지 확인한다. 자바스크립트에서 instanceof 연산자는 우변 피연산자의 프로토타입이 좌변 피연산자의 프로토타입 체인에 있는지 찾아본다. 만약 있으면 좌변 피연산자는 우변 피연산자의 인스턴스라고 결론 내린다.
new 키워드를 앞에 붙여 생성자 함수를 실행하면 일단 빈 객체를 하나 만들어 새 객체의 프로토타입을 생성자 함수의 프로토타입 프로퍼티에 연결한다. 그런 다음 생성자 함수를 this로 실행하여 새 객체를 찍어낸다.
new가 없다면 이런 일은 일어나지 않는다. 실행 후 생성자 함수와 새 객체는 아무 연관이 없고 예제 3-4와 3-5는 전역 객체에 묶인다. 또한, 프로토타입 할당도 없으므로 instanceof 연산 결과는 false다.