2009-05-28 7 views
5

어떻게 변수 이름을 던져서 클래스를 인스턴스화 할 수 있습니까?변수를 통해 클래스를 동적으로 인스턴스화

animate: function(el, build) { 
     console.log(build.effect); 
     var animationClass = new build.effect(el,build); 
}, 

빌드 물건을 많이 포함하는 객체이지만, 가장 중요한 "효과" 클래스 내에서이 방법을 고려하십시오. 이 효과는 독립적 인 애니메이션 클래스의 이름입니다. "MarioKartMenu"라고합니다.

console.log (build.effect)는 "MarioKartMenu"를 출력합니다. 물론 얻을 수 있습니다 : TypeError : 표현식 'build.effect'의 결과 [MarioKartMenu]가 생성자가 아닙니다.

내가 동성을 쓰레기 단지와 같은 코드를 한 경우 :

animate: function(el, build) { 
     var animationClass = new MarioKartMenu(el,build); 
    }, 

그것은 잘 작동합니다. 내가하려고하는 것처럼 역동적으로 만들 수 있습니까? 기능 MarioKartMenu가 글로벌 범위에서 정의 된 경우

답변

5

, 당신은 사용하여 문자열 이름으로 액세스 할 수 있습니다 :

window["MarioKartMenu"] 

모든 글로벌 변수는 window 개체의 속성이기 때문에이 작동합니다.

위 감안할 때, 당신은 사용하여 당신이 원하는 것을 구현할 수 있습니다

var menuConstructor = window[build.effect]; 
var animationClass = new menuConstructor(el, build); 
+0

완벽한, 나는 그것이 그것을 느끼는 것은 그런 일을 보일 것이다했다. 고맙습니다. –

+0

js 클래스 안에 있으면 **'this [ "MarioKartMenu"]'**로 사용할 수 있습니다. 나는 잠시 동안 이것에 맞았고, 그것을 이해했다!! – IJas

0

내 첫번째 생각은 내가이 덜 우아한 이상의 솔루션을 이해하지만, 자바 스크립트의 eval() 연산자를 사용하는 것입니다. (이것처럼 Soemthing : var animationClass = eval("new "+build.effect+"(el, build)"); 비록 정확한지 모르겠지만 내가 전에 eval()을 사용하지 않았습니다.). Ayman의 대답은이 아이디어에서 훨씬 더 좋은 변형입니다.

나의 두 번째 생각은 MarioKartMenu이 적절하게 추출되지 않았다는 것입니다. 따라서 세 번째 매개 변수로 효과 이름을 사용하는 간단한 클래스를 작성하고 switch() 문을 사용하여 사용 가능한 모든 효과를 선택하고 올바른 인스턴스를 인스턴스화 한 다음이를 반환합니다.

+0

좋은 제안. 결국 애니메이션 클래스를 호출하는 클래스가 누구나 자신의 애니메이션을 만들고 사용할 수 있도록 확장 할 수 있기 때문에 어떤 영향이 있을지 전혀 알 수 없습니다. 따라서 switch 문은 작동하지 않습니다. –

2

그냥 build.effect에 생성자 (하지의 이름을 포함하는 문자열)을 할당하고 그것을 작동합니다 :

animate = function(el, build) { 
    var animationClass = new build.effect(el,build); 
} 
// ... 

b = ...; 
b.effect = MarioKartMenu; 
animate(e, b); 
+0

또한 알아두면 좋지만 다시 한번 다른 사람들이 애니메이션 클래스의 이름을 지정할 수 있는지 모르겠다. 그래서 여전히 문자열을 다루어야한다. 아마도 나는 당신이 말하는 것을 오해하고 있습니다. –

+1

클래스의 사용자가 사용할 효과를 지정해야합니다. 거기에 생성자 함수 이름을 가진 문자열 대신 생성자 함수 자체를 제공 할 수 있습니까? 인터페이스가 어떻게 보이는지 모르겠지만 사용자가 다음과 같이 처리하는 것처럼 보입니다. var FooMenu = {...}; setEffect ("FooMenu") ;. 문자열을 사용하지 말고 FooMenu를 직접 전달하는 것이 좋습니다 : var FooMenu = {...}; setEffect (FooMenu) ;. – sth

+0

매우 유효합니다. 나는 이것을 탐구 할 것이다. –

관련 문제