问题描述
我使用 ES6 代理为 toString
方法构建了一个钩子。在调试一些问题时,我注意到处理程序的 console.log
无缘无故地被调用。
class Hook {
constructor(object) {
this.object = object;
}
toStringproperty() {
const handler = {
apply: (target,thisArg,args) => {
console.log(target,args);
if (thisArg === Function.prototype.toString) {
return 'function toString() { [native code] }'
}
if (thisArg === this.object) {
return "Hooked String"
}
return target.apply(thisArg,args)
}
}
Function.prototype.toString = new Proxy(Function.prototype.toString,handler)
}
}
let hook = new Hook(HTMLAudioElement);
hook.toStringproperty()
HTMLAudioElement.toString();
我花了很多时间试图找出导致这种递归的原因,但恐怕找不到任何东西。
注意:在控制台中键入 HTMLAudioElement
或 ooo
后也会发生此行为,当然您必须在运行上述代码后执行此操作。我的浏览器是 Chrome。我使用 Devtools Console 进行了测试。
解决方法
在处理程序中,您调用 console.log(target,thisArg,args);
,其中 target
和 thisArg
是函数。 devtools 控制台似乎使用 .toString()
来获取函数的名称以显示它。