据我了解,ES 规范说Proxy(用于代理对象、函数和类的全局构造函数)是不可检测的。这意味着如果我代理一个函数,使用该代理函数的任何人都无法检测到我使用了代理。然而,显然我误解了它,因为代理功能是可以检测到的。
例如,new Proxy(a=>a,{apply:a=>a})+''抛出错误。它说
Uncaught TypeError: Function.prototype.toString requires that 'this' be a Function
Run Code Online (Sandbox Code Playgroud)
然而,typeof new Proxy(a=>a,{apply:a=>a})确实是"function",但它以某种方式无法对代理进行字符串化。因此,显然,在这种情况下,代理函数的行为与非代理函数的行为不同。Function.prototype.toString能够区分代理函数和非代理函数。
我的目标是代理一个函数,使其变得不可检测。我的第一个想法是像这样真正代理代理:
Proxy.toString = (a => () => a)(Proxy + '');
Proxy = new Proxy(Proxy, {
construct: (f, args) => {
if(typeof args[0] == 'function'){
var a = args[0] + '';
args[0].toString = () => a;
}
return new f(...args);
}
});
Run Code Online (Sandbox Code Playgroud)
但遗憾的是,这是可以检测到的。如果有人调用Function.prototype.toString绑定到我的代理函数,则会发生错误,因此他可以检测到我的函数实际上是代理。因此,我尝试代理Function和Function.prototype,Function.prototype.toString但后来我意识到我无法代理Function,因为即使我覆盖全局属性Function,有人也可以使用 …
javascript google-chrome v8 google-chrome-extension ecmascript-2016