运行 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);
非常感谢您的帮助!
以下代码片段由于某种原因不起作用,我很乐意提供帮助。
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);
非常感谢您的帮助!