Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用toString和eval()运行Javascript类函数_Javascript_Class_Oop_Eval_Tostring - Fatal编程技术网

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

使用toString和eval()运行Javascript类函数,javascript,class,oop,eval,tostring,Javascript,Class,Oop,Eval,Tostring,下面的代码段由于某种原因不起作用,我很乐意提供帮助 var MyClass={ 剂量:功能{ 提醒“你好”; } } const evalString='new'+MyClass.toString+'.doSomething'; 蒸发 我认为你使用eval。也许您可能想在下面再次简单地阅读一下eval的用法 不要不必要地使用eval! eval是一个危险的函数,它以调用方的权限执行传递给它的代码。如果使用可能受恶意方影响的字符串运行eval,则最终可能会在具有网页/扩展名权限的用户计算机上运行

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

var MyClass={ 剂量:功能{ 提醒“你好”; } } const evalString='new'+MyClass.toString+'.doSomething'; 蒸发 我认为你使用eval。也许您可能想在下面再次简单地阅读一下eval的用法

不要不必要地使用eval! eval是一个危险的函数,它以调用方的权限执行传递给它的代码。如果使用可能受恶意方影响的字符串运行eval,则最终可能会在具有网页/扩展名权限的用户计算机上运行恶意代码。更重要的是,第三方代码可以看到调用eval的范围,这可能导致以类似函数不易受影响的方式进行攻击

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);
哪一种评价;被错误地使用了


您可能需要阅读更多内容,以帮助您确定您计划归档的内容以及更好的归档方式。

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

类MyClass{ 剂量{ 提醒“你好”; } } const evalString='new'+MyClass.toString+'.doSomething';
蒸发;MyClass不是一个类。也许你指的是类MyClass{doSomething{alert'Hello';}}。你在编程语言中会感到困惑,这就是javascript中定义类的方式。我没有感到困惑,而这并不是javascript中定义类的方式。真的。@Ryan你说得对!欢迎回答Down我明白你想说什么,我不会使用问题附带的代码,这只是我问题的一个例子很高兴知道你明白,我想你也可以将同样的概念应用到你的问题中。我正在尝试从函数browser.devtools.inspectedWindow.eval中捕获一个dom元素。附加链接中的更多信息,你可以发布你正在谈论的github链接吗,在回答你的问题之前,我就已经尝试过了,但是你最终只能得到:class MyClass{doSomething{alert'Hello';}}}const evalString='new'+MyClass.toString+'.doSomething';console.logevalString;新函数MyClass{}。doSomething未定义,对我来说没有任何意义。按Run code snippet按钮,它可以完美地工作!非常适合:Error:{message:TypeError:intermediate value.doSomething不是函数,文件名:https://stacksnippets.net/js 第21行>求值,行号:1,行号:1}?