gpt4 book ai didi

javascript - 使用 ES6 代理替换原型(prototype)时超出最大调用堆栈大小

转载 作者:行者123 更新时间:2023-11-28 16:51:32 25 4
gpt4 key购买 nike

我有一个 typescript 类装饰器

export function Profile(config: ProfilerConfig): ClassDecorator {
return function <TFunction extends Function> (target: TFunction) {
logToConsole = config.logToConsole || false;
Object.setPrototypeOf(
target.prototype,
new Proxy(target.prototype , handler)
);
};
}

我正在尝试用目标原型(prototype)的代理替换原型(prototype),并且我得到了

ERROR RangeError: Maximum call stack size exceeded

但我没有看到任何明显的递归。当我使用时

target.prototype = new Proxy(target.prototype , handler)

这不会发生。有什么想法吗?

最佳答案

target.prototype = new Proxy(target.prototype , handler)

这会将 targetprototype 设置为其自身的代理。

Object.setPrototypeOf(
target.prototype,
new Proxy(target.prototype , handler)
);

这会将 target.prototypeprototype 设置为 target.prototype 的代理。然后你就得到了一个循环依赖:Object.getPrototypeOf(target.prototype) == proxy(target.prototype),因此当JavaScript尝试遍历原型(prototype)链时,它将陷入无限循环一遍又一遍地调用代理处理程序。

<小时/>

我认为 Object.setPrototypeOf() 在这里没有任何意义。此函数旨在设置实例的原型(prototype)。您似乎正在尝试设置构造函数的原型(prototype),即通过 new constructor 创建实例时将继承的 constructor.prototype 对象。您需要像第一个代码片段中一样直接分配构造函数的prototype

关于javascript - 使用 ES6 代理替换原型(prototype)时超出最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59887438/

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