2014-02-25 3 views
3

객체 instanceof를하는 경우 :개체 건설 : 시험이 내가 공급 업체 코드의 개체 생성자에서이 테스트를 본 적이

function MyObject() { 
    if (!(this instanceof MyObject)) return new MyObject; 
    ... 
} 

내 첫 성향이 테스트는 다른 this 값 때 바인딩을 방지하기 위해 사용된다는 점이다 생성자를 호출합니다. 그러나, 내가 놓치고있는 다른 것이 있으면 여기에서 확인하고 싶었다. 누군가이 시험의 정확한 의도를 설명해 주시겠습니까?

답변

7

이 테스트는 MyObject 항상 즉, 생성자로 사용 있는지 확인하는 것입니다 :

var instance = new MyObject(); 

하고 코드의 원치 않는 동작이 발생할 것입니다 결코

var instance = MyObject(); 

.

누군가가 우연히 var instance = MyObject(); 양식을 사용하면이 함수의 내부에있는 this은 전역 객체 (윈도우)가되고 instanceof 검사는이 경우 적절한 생성자 호출을 강제합니다.

그러나 개발자 실수를 수정하기 때문에이 패턴이 위험하다고 생각하는 사람들이 있습니다. 나는 개인적으로 예외를 던질 것이 아니라 부주의 개발자가 모든 것이 괜찮은 것처럼 떨어지게 만든다.

+1

위대한 답변! 그리고 100 %는 부주의 한 개발자의 손을 잡기보다는 예외를 던져야한다고 동의합니다. – srquinn

+0

이것은 모듈의'export' 값이 객체 생성자뿐만 아니라 많은 다른 것들이 될 수있는 nodejs 모듈에서 주로 보인다고 덧붙여 야합니다. 이것으로 문서화 및 예외 처리는 개발자를위한 코드를 "수정"하는 것이 여전히 우위입니다. 나는 묵시적인 구조가 문제의 테스트가 막으려 고 시도하는 것보다 더 심각한 코드 남용으로 이어질 것이라고 주장한다. – srquinn