С некоторой предусмотрительностью вы можете сделать это довольно легко и защитите себя от использования eval
. Сохраните где-нибудь список классов, которые вы хотите создать по имени:
class Dog
bark:->
"Woof"
# Or window.named_classes if you need to access
# `named_classes` globally (or just in another
# CoffeeScript file).
named_classes = { Dog: Dog }
и затем используйте таблицу поиска вместо eval
:
name = 'Dog'
dog = new named_classes[name]
Когда вы говорите class Dog
, вы получаете локальную переменную с именем Dog
:
var Dog;
Dog = (function() { /* ... */ })();
и нет никакого способа получить локальную переменную JavaScript, если вы не храните ее где-нибудь, к которому вы можете получить доступ по имени. Также обратите внимание, что eval
не будет работать, если вы определите Dog
в одном файле CoffeeScript и захотите получить к нему доступ в другом, CoffeeScript упаковывает каждый файл в самозапускающуюся анонимную функцию, чтобы ограничить область действия переменной :
все выходные данные CoffeeScript заключены в анонимную функцию: (function(){ ... })()
; Эта защитная оболочка в сочетании с автоматической генерацией ключевого слова var
чрезвычайно затрудняет случайное загрязнение глобального пространства имен.
Если вы хотите создать переменные верхнего уровня для использования другими сценариями, присоедините их в качестве свойств к окну или к экспорту объекта в CommonJS.