2011-04-13 24 views
6

ile alın. Adından bir nesneyi Javascript'te almak istiyorum. Bazı farklı bağlamları yüklemesi gereken bir uygulama üzerinde çalışıyorum, "inherit" jquery eklentisi ile farklı sınıflar yüklemek için deniyorum. Her şey gayet iyi çalışıyor, çünkü bir sınıfı anlatabilmem gerektiğinde, sadece sınıfın adı ve doğrudan nesnenin değil.Nesne sınıfını dize adından javascript

Temel olarak, 'getClass (String name)' gibi bir şey bulmak istiyorum. Bana yardım eden var mı?

+0

Tamam) (, bu aptalca, ama neden 'eval kullanarak yok benim nesne yapmak hüner ... Bu işe yaramaz yazı için Maalesef ... – Celero

cevap

10

eval()'u kullanmayın.

var classes = { 
    A: <object here>, 
    B: <object here>, 
    ... 
}; 

ve sonra sadece onları aramak:

Bir haritanın Sınıflarınızı depolayabilir

new classes[name]() 
+0

adını ') (eval' fonksiyonunu kullanarak ' Hata ? Bunu yapamam, "sınıflarım" genel ve belirli bir bağlamda yük olmalı, ben böyle bir haritayı yükleyemiyorum ... – Celero

+0

@Celero: Çünkü eval() 'kullanılabilir Bir güvenlik riski olabilecek keyfi kod yürütmek için. İhtiyaç duyduğunuzdan çok daha fazla güç sağlar. Neden haritayı kullanmıyorsun? Jenerikle ne demek istiyorsun ve hangi bağlamdan bahsediyorsun? Daha fazla bilgi verirseniz, sizi daha iyi bir hale getirebiliriz. –

+0

Ben tamamen yanlıştı, hileler ihtiyacım olduğu gibi uygulanabilir. Teşekkürler ! – Celero

5

JavaScript: Call Function based on String:

function foo() { } 
this["foo"](); 
+0

Bu, temelde eval() ile aynı şeyi yapar, değil mi? – Celero

+0

@Celero - no. Genel kod olarak çalıştır, * bu * gobal/window nesnesine referansta bulunacak, yani * window ['foo'] * ile eşdeğerdir. Bunu başka bir kapsamda kullanıyorsanız, * bu * neyin referans aldığı hakkında hiçbir fikriniz olmayabilir. **, kapsam değişkenine veya aktivasyon nesnesine (yani yürütme bağlamına), değişken özünürlük zincirindeki nesnelerin üstüne oturduğundan istediğinizi gösteren ** referans değildir. – RobG

+0

Tamam, doğruluğunuz için teşekkürler. – Celero

0

Bunu ifade ediyor mu?

function Person(name){ 
    this.name = name; 
} 

function getClass(str_name, args){ 
    return new (window[str_name])(args); 
} 

var wong2 = getClass("Person", "wong2"); 

alert(wong2.name); // wong2 
+0

Hayır, bazıları arasında kalıtımla bir grup sınıfa sahibim, sadece belirli bir durumda bir kerede birini yüklemem gerekiyor. Bu yüzden eval() benim için iyi ... – Celero

+0

@celero bir örnek verebilir misiniz? belki biraz kod? – wong2

+0

Üzgünüm, yapamam, neyse Felix Kling tekniklerini deneyeceğim ve görüyorum ... Yardımlarınız için teşekkürler – Celero