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

时间:2018-02-19 00:15:09

标签: javascript class oop eval tostring

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

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

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

eval(evalString);

2 个答案:

答案 0 :(得分:0)

我认为你使用eval()。也许您可能需要再次阅读以下eval()的使用情况。

不要不必要地使用eval!

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

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

对于常见用例,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()上阅读更多内容,以帮助您了解您计划归档的具体内容以及更好的归档方式。

答案 1 :(得分:0)

按照@ Ryan的评论,答案是:

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

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

eval(evalString);

非常感谢你的帮助!

相关问题