gpt4 book ai didi

javascript - 为什么这个代理处理程序会导致无限递归?

转载 作者:行者123 更新时间:2023-12-04 14:56:05 28 4
gpt4 key购买 nike

我使用 ES6 代理为 toString 方法构建了一个钩子(Hook)。在调试一些问题时,我注意到处理程序的 console.log 无故被调用。

class Hook {
constructor(object) {
this.object = object;
}

toStringProperty() {
const handler = {
apply: (target, thisArg, args) => {

console.log(target, thisArg, 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();

我花了很多时间试图找出导致这种递归的原因,但恐怕找不到任何东西。

注意:此行为也会在控制台中键入 HTMLAudioElementooo 后发生,当然您必须在运行上述代码后执行此操作。我的浏览器是 Chrome。我使用 Devtools 控制台进行了测试。

最佳答案

在处理程序中,您调用 console.log(target, thisArg, args); 其中 targetthisArg 是函数。 devtools 控制台似乎使用 .toString() 来获取显示它的函数的名称。

关于javascript - 为什么这个代理处理程序会导致无限递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67965110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com