从字符串向对象追加javascript函数和vars声明

从字符串向对象追加javascript函数和vars声明,javascript,class,web,Javascript,Class,Web,我面临以下问题: 我有一个字符串,其中包含javascript变量和函数声明 例如: // this is the content of the jsString var passed to the _MyClass ctor var toto = "Hey"; var foo ="oh"; function myFunc(str) { toto = str; } 我有一个类声明如下: class _MyClass { constructor(jsString) // wher

我面临以下问题:

我有一个字符串,其中包含javascript变量和函数声明

例如:

// this is the content of the jsString var passed to the _MyClass ctor
var toto = "Hey";
var foo ="oh";
function myFunc(str) {
    toto = str;
}
我有一个类声明如下:

class _MyClass
{
    constructor(jsString) // where JsString is the above JS 
    {
        this.aVar = 2;
    }
}
我想用JS字符串填充我的\u MyClass类。 我需要能够打电话:

var myClassInstance = new _MyClass(jsString);
myClassInstance.myFunc("test");
我知道可以用eval函数填充窗口对象,但我不知道对象是否可以(对象上的eval func已弃用)

我也知道这并不常见,但它是在我没有选择权的特定环境中使用的


提前感谢您的帮助。

这个要求很奇怪,我强烈建议您尽一切可能消除这个要求,将数据传递给构造函数,而不是包含代码的字符串

但对于需求本身:除非您事先知道字符串中变量和函数的名称,否则在没有JavaScript解析器的情况下无法实现这一点(例如-该链接现在已关闭,但我假设它是临时的)

使用Esprima或类似的工具,您会:

  • 解析代码

  • 使用解析数据(行和字符等)中的信息修改代码字符串,将
    var toto=…
    更改为
    obj.toto=…
    function myFunc()…
    更改为
    obj.myFunc=function myFunc()…
    等(注意并小心丢失提升,因为我们正在将函数声明更改为函数表达式)。您还必须在函数中查找并更新对标识符的引用(您可以使用Esprima,也可以使用其他函数)

  • 然后在构造函数中:

    var obj = this;
    eval(theUpdatedCode);
    
    …在当前上下文中评估代码。这将把各种内容分配给
    obj


  • 同样地,我不会这样做,我会尽我最大的努力来改变要求。

    你到底想达到什么?MyClass的ctor中的字符串参数做什么?你只是想从一个实例方法中设置一个全局变量,还是想设置一个实例变量?你为什么需要这样做ave代码是这样的字符串?!(不是我的dv)我知道这不是一种常见的做法,但我没有选择。传递给我的ctor的字符串是我的帖子“var toto=”嘿“…”@Akiat:为什么你没有选择?因为我需要模拟一个环境。