运行 Javascript Class 函数使用 toString 和 eval()

Run Javascript Class function using toString and eval()

以下代码片段由于某种原因不起作用,我很乐意提供帮助。

var MyClass = {
  doSomething: function() {
    alert('Hello');
  }
}

const evalString = 'new (' + MyClass.toString() + ')().doSomething()';

eval(evalString);

我认为你对 eval() 的用法。也许您可能想再次阅读下面 eval() 的用法。

不要不必要地使用 eval!

eval() 是一个危险的函数,它以调用者的权限执行传递给它的代码。如果您 运行 eval() 的字符串可能会受到恶意方的影响,您最终可能会 运行 使用您的网页/扩展程序的权限在用户计算机上安装恶意代码。更重要的是,third-party 代码可以看到 eval() 被调用的范围,这可能导致以类似函数不易受到影响的方式进行可能的攻击。

eval() 通常也比替代方案慢,因为它必须调用 JS 解释器,而许多其他构造由现代 JS 引擎优化。

常见的 use-cases.

eval() 有更安全(更快!)的替代品

正在访问成员属性

您不应使用 eval() 将 属性 名称转换为属性。考虑以下示例,其中要访问的对象的 属性 在执行代码之前是未知的。这可以通过 eval:

var obj = { a: 20, b: 30 };
var propName = getPropName();  // returns "a" or "b"

eval( 'var result = obj.' + propName );

然而,eval()在这里不是必需的。事实上,这里不鼓励使用它。相反,使用 属性 访问器,它更快更安全:

var obj = { a: 20, b: 30 };
var propName = getPropName();  // returns "a" or "b"
var result = obj[ propName ];  //  obj[ "a" ] is the same as obj.a

您甚至可以使用此方法访问后代属性。使用 eval() 这看起来像:

var obj = {a: {b: {c: 0}}};
var propPath = getPropPath();  // returns e.g. "a.b.c"

eval( 'var result = obj.' + propPath );

对于您自己的情况,您有:

const evalString = 'new (' + MyClass.toString() + ')().doSomething()';

eval(evalString);

其中 eval(evalString); 被错误使用。

您可能需要阅读更多关于 eval() 的内容,以帮助您弄清楚您计划归档的内容以及更好的归档方式。

根据@Ryan 的评论,答案是:

class MyClass {
  doSomething() {
    alert('Hello');
  }
}

const evalString = 'new (' + MyClass.toString() + ')().doSomething()';

eval(evalString);

非常感谢您的帮助!