React / Javascript - Концептуальный подход для выполнения Javascript кода из строки - PullRequest
6 голосов
/ 31 марта 2020

В настоящее время у меня возникла проблема с концепцией в моем приложении.

Пользователь должен иметь возможность создать класс Javascript внутри моего приложения реакции / редукции, и мое приложение должно иметь возможность выполнить написанное javascript code.

Пример, пользователь A пишет:

class PredefinedClassName {
  constructor(a) {
    this.a = a;
  }

  getSomething(parameterFromOutside) {
    return this.a * parameterFromOutside;
  }
}

Этот класс затем сохраняется в виде строки (важно) в некоторой базе данных.

Далее я хочу загрузить этот класс (снова в виде строки) и выполните следующие действия:

  1. Создайте экземпляр этого класса, который содержится в строке ... (Как?)
  2. Вызовите "getSomething" метод в экземпляре и передать свой собственный метод методу (Как?)

Поскольку это довольно редкий случай использования, литературы о ней очень мало, а библиотеки почти нет.

Примечание к сайту: Кроме того, я должен также проверить наличие синтаксических ошибок и ошибок времени выполнения, но я считаю это следующим шагом, поэтому сначала я хотел бы решить элементарную часть.

Есть ли у вас какие-либо идеи? о том, как решить эту концептуальную проблему? * 102 2 *

Спасибо и привет!

1 Ответ

7 голосов
/ 10 апреля 2020

Создание экземпляра класса, который хранится в строке, на самом деле довольно просто, браузеры в основном делают это в фоновом режиме. Все, что вам нужно сделать, это следующее:

// Save your javascript class in a string variable:
const classString = `class PredefinedClassName {
  constructor(a) {
    this.a = a;
  }

  getSomething(parameterFromOutside) {
    return this.a * parameterFromOutside;
  }
}`;

// Create an instance of this class with eval() function, by appending the original class declaration before the instantiation, and do not return the newly created class inside the eval, just create it like so:
const customParameterValue = 5;
const instanceOfClass = eval(classString + `new PredefinedClassName(${customParameterValue})`)

// Now you can use 'instanceOfClass' as usual:
instanceOfClass.getSomething(10)

Не стесняйтесь просить каких-либо разъяснений в комментариях:)

...