Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   создание объекта по строке (https://javascript.ru/forum/css-html/83128-sozdanie-obekta-po-stroke.html)

fxobject 22.09.2021 21:51

создание объекта по строке
 
Господа подскажите вариант:
имеем
let nameClass = 'someClass';

есть описание класса
class someClass {
............................
}

нужно по содержимому строки nameClass создать объект
типа
eval('new '+nameClass )......
eval как то не очень хочется. Есть ли какие либо другие варианты?

Aetae 22.09.2021 22:22

Положить твои классы заранее в объект.
const classes = {
  SomeClass,
  //...
};
//...
new classes[nameClass]();

fxobject 22.09.2021 22:44

так не могу. описание класса загружается динамически. все подобные классы являются производными от некоего базового класса. и подгружаются по мере действий абонента на странице. т.е. создать полный список объектов
const classes = {} - возможности нет.

Aetae 22.09.2021 22:46

Когда подгружаешь делай в подгружаемом коде classes.SomeClass = SomeClass.
Это единственно адекватное решение.

Иначе фигачь eval всё равно говнокодишь, пофиг уже.

fxobject 22.09.2021 22:47

хотя наверное что то типа этого все таки придется сделать. можно чтобы при загрузки описания объекта заполнялся подобный массив.... в общем то это решение лучше чем eval. что то типа виртуального конструктора получили )))
Спасибо

fxobject 22.09.2021 22:55

фишка еще в том, что заполнять данный массив classes.SomeClass = SomeClass нужно ДО загрузки скрипта. а после уже делать new. ДО загрузки еще нет описания. по идее выпадет ошибка..... капец. надо думать

fxobject 22.09.2021 23:08

на счет говнокода не совсем понятно - откуда такое убеждение?

fxobject 22.09.2021 23:42

может кому пригодится - вот получилось такое решение
1 загрузка скрипта
//-первый параметр - маршрут скрипта
// второй параметр - callback при успешной загрузке которому передается строка с именем загружаемого класса.
this.storage.loadScript( supportedHardware[this.switchModel].path,
this.loadScriptHandler.bind(this,supportedHardware[this.switchModel].class) );

2. в самом скрипте - помимо описания класса в конце скрипта
devices['Catalyst-1000'] = Catalyst-1000; - это и есть массив по которому будет создаваться (new) новый объект.

3 и callback при успешной загрузки скрипта
loadScriptHandler( classDescription ){
this.switchObject = new devices[classDescription];
...................................


Часовой пояс GMT +3, время: 13:04.