由于某些原因,以下代码段不起作用,我很乐意为您提供帮助。
var MyClass = {
doSomething: function() {
alert('Hello');
}
}
const evalString = 'new (' + MyClass.toString() + ')().doSomething()';
eval(evalString);
答案 0 :(得分:0)
我认为你使用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);
非常感谢你的帮助!