我有一个 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)
这会将 target
的 prototype
设置为其自身的代理。
Object.setPrototypeOf(
target.prototype,
new Proxy(target.prototype , handler)
);
这会将 target.prototype
的 prototype
设置为 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/