2012-07-24 1 views
2

가능한 중복 : 그것은이 새로운 인스턴스를 생성하기 위해 호출 않다면
How to detect if a function is called as constructor?JavaScript 함수가 정상적으로 호출되었는지 또는 "new"와 함께 호출되었는지를 알 수있는 방법이 있습니까?

나는 그것이 정상이라고하면 다르게 작동 자바 스크립트의 기능이 좋아하거나 것입니다. 두 가지 기능이 관련되거나 관련되지 않을 수있는 다양한 용도가있을 수 있습니다.

function MyClass(arg1, arg2) { 
    if(/* not called with "new" */) return new MyClass(arg1, arg2); 

    // instance initialization stuff here... 

} 

내가 var x = new MyClass(arg1, arg2)를 입력 할 필요가 없습니다 것입니다이 방법 : : 함수가 항상 새로운 인스턴스를 생성하는 데 사용하는 경우 하나 개의 사용은 new를 입력 할 필요가 코더를 면제하는 것입니다 var x = MyClass(arg1, arg2)를 입력하기에 충분 것 (그러나 전자는 틀리지 않을 것이다).

가능한 한 가지 예입니다.

이 작업을 수행 할 수 있습니까? 그렇다면 어떻게?

+0

중복이 누락 된 것에 대해 사과드립니다. "constructor"키워드를 찾아 보았습니다. 답변 해 주셔서 감사합니다! – Tom

답변

5

는 함수가 호출하는 방법을 절대적으로 확신 할 수있는 방법이 없습니다,하지만 당신은 꽤과 같이, this instanceof MyClass를 사용하여 확인하실 수 있습니다 :

if (this instanceof MyClass) { 
    // Was called with `new` 
} else { 
    // Was called as regular function 
} 

있다 가장자리 경우를 생각 예를 들어, MyClass의 새 인스턴스를 만든 다음 MyClass.call(new MyClass)을 수행 할 수 있습니다. 이것은 바깥 쪽 MyClassnew으로 호출되지 않았기 때문에 위양성을 생성합니다.

+0

나는 이것을 기초로 삼았고 새로운 것을 추가 할 때 깃발을 꽂았다. 그래서 함수가 호출 될 때 나는'this'가 my 클래스의'instanceof'이고, 2. 그 플래그는 여전히 설정되어 있지 않음을 확인합니다. 두 조건이 모두 유지되면 - 새로운 것입니다 (이 경우 플래그를 설정하고 다른 작업을 수행합니다). 그렇지 않다면, 나는 그것이 클래스의 다른 메소드로부터의 일반적인 함수 호출이라는 것을 안다. – Tom

1

내가 여기서 생각할 수있는 유일한 옵션은 this의 값을 테스트하는 것입니다. 당신은 시도 할 수 있습니다 :

function MyClass(args) { 
    var isInstance = this instanceof MyClass; 
    // ... 
} 
1
if(this instanceof MyClass) 

아마 당신을 위해 무엇을 찾고있어. .call.apply으로 바보일 수도 있지만 어쨌든 인스턴스가 전달되면 개체를 구성하는 데 문제가 없어야합니다.

관련 문제