2009-05-28 19 views
5

Jak utworzyć instancję klasy, wprowadzając nazwę zmiennej? Rozważmy tę metodę wewnątrz klasy:Utwórz dynamicznie klasę za pomocą zmiennej

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

budowy jest obiekt zawierający wiele rzeczy, ale przede wszystkim „Effect” . Ten efekt jest nazwą niezależnej klasy animacji - nazywa się "MarioKartMenu".

console.log (build.effect) wypisuje "MarioKartMenu". Ale oczywiście otrzymuję: TypeError: Wynik wyrażenia 'build.effect' [MarioKartMenu] nie jest konstruktorem.

Gdybym kosza dynamizm i po prostu zrobić kod jako takie:

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

To działa dobrze. Czy jest możliwe, aby był dynamiczny, tak jak próbuję to zrobić?

Odpowiedz

5

Jeśli funkcja MarioKartMenu jest zdefiniowane w zakresie globalnym, można uzyskać do niego dostęp za pomocą swojej nazwy strun:

window["MarioKartMenu"] 

To działa, ponieważ wszystkie zmienne globalne są właściwości obiektu window.

Biorąc powyższe pod uwagę, można zaimplementować, co chcesz za pomocą:

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

Perfect, miałem to uczucie to będzie wyglądać coś takiego. Dziękuję Ci. –

+0

jeśli znajduje się wewnątrz klasy js, możesz użyć jako ** 'this [" MarioKartMenu "]' **. Uderzyło mnie to na chwilę i wymyśliłem to !! – IJas

0

Moja pierwsza myśl jest użycie eval() operatora obsługa JavaScript, choć rozumiem, że jest to mniej niż eleganckie rozwiązanie. (Soemthing like this: var animationClass = eval("new "+build.effect+"(el, build)");, chociaż nie jestem pewien, czy to prawda, ponieważ wcześniej nie używałem tego.). Odpowiedź Aymana jest znacznie lepszą odmianą tego pomysłu.

Moja druga myśl jest taka, że ​​MarioKartMenu nie jest odpowiednio wyodrębniony. Stworzyłem więc wokół niej prostą klasę, która przyjmuje nazwę efektu jako trzeci parametr i używa instrukcji switch(), aby wybrać spośród wszystkich dostępnych efektów, utworzyć właściwy i zwrócić go.

+0

Dobre sugestie. W końcu nie mam pojęcia, jakie będą efekty, ponieważ klasa nazywająca klasy animacji będzie w pełni rozbudowywana, aby umożliwić każdemu stworzenie własnych animacji i korzystanie z nich. Tak więc instrukcja switch nie zadziała. –

2

Wystarczy przypisać konstruktora build.effect (nie łańcuch zawierający nazwę) i to powinno działać:

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

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

Dobrze wiedzieć, ale po raz kolejny nie mam pojęcia, co inni mogą nazywać swoimi klasami animacji, więc nadal będę miał do czynienia z ciągiem znaków. Być może nie rozumiem, co mówisz. –

+1

Gdzieś, którzy użytkownicy Twojej klasy muszą określić, którego efektu użyć. Czy nie mogą tam podać samej funkcji konstruktora zamiast łańcucha zawierającego nazwę funkcji konstruktora? Nie jestem pewien, jak interfejs będzie wyglądać, ale wygląda na to, że użytkownik zrobiłby coś takiego: var FooMenu = {...}; setEffect ("FooMenu") ;. Sugerowałbym, aby nie używać łańcucha, ale przekazywać bezpośrednio FooMenu: var FooMenu = {...}; setEffect (FooMenu) ;. – sth

+0

Bardzo ważne. Zamierzam to zbadać. –