У меня есть вопрос, который не должен быть слишком сложным, но я целыми днями не могу найти ответа. Все решения, которые я нашел, мне не помогли, все они выдавали ошибки.
Я создал класс в Javascript и хочу создать новый экземпляр динамически, чтобы я мог создавать экземпляры нескольких классов в зависимости от параметра в функции. Кажется, это не работает, и мне интересно, почему.
settings.js и main.js загружаются через тег <script> в HTML-файл, причем сначала загружается settings.js.
main.js
let myClass = new settings(); // Works
let myClass2 = test('settings'); // Error: Uncaught TypeError: param is not a constructor
function test(param){
return new param();
}
settings.js
class settings{
constructor(){
console.info("works");
}
}
Спасибо за любую помощь!
Вы не можете просто создать экземпляр строки, вы, вероятно, могли бы использовать строку для поиска класса, например, new window[param]()
Что ж, ошибка очень емкая. Вы передаете «настройки» в качестве аргумента и ожидаете, что функция вернет его экземпляр. Но это не конструктор - это строка.
Просто удалите одинарные кавычки. let myClass2 = test(settings);
@csmckelvey: Это уничтожило бы всю цель динамического поиска.
@ H.B. OP не хочет динамического поиска.
@ H.B. что вы имеете в виду под «динамическим поиском», вы не можете передать строку и ожидать, что она волшебным образом вернет класс с тем же именем.
csmckelvey, удаление кавычек сработало. Я также рассмотрю другие ответы, всем спасибо!
Ваша проблема может быть сведена к: console.info(42); // works и var x = 42; console.info('x'); // doesn't work
@RyanSchaefer: Да, можно, если передать как ключ к объекту, например, как отметила Мари.
Я бы ответил, что вам следует реализовать шаблон проектирования Factory style в JS с образцом кода, но вопрос, помеченный как «дубликат», заблокирован. Почему я предлагаю поискать в Google "пример шаблона проектирования Javascript Factory"? Ну, вы пытаетесь определить функцию, которая будет возвращать объект класса в зависимости от переданного ей значения переменной. Если вы намереваетесь определить более одного значения класса (например, «settings», «config», «action»), то вы в основном будете следовать шаблону Factory. Быстрый поиск в Google покажет кучу хороших примеров.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


param - это переменная, вы, вероятно, ищете что-то вроде этого: stackoverflow.com/questions/34655616/…