javascript - 使用 ES6 代理替换原型时超出最大调用堆栈大小
问题描述
我有一个打字稿类装饰器
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)
);
};
}
我正在尝试用目标原型的代理替换原型,我得到了
ERROR RangeError: Maximum call stack size exceeded
但我没有看到任何明显的递归。当我使用
target.prototype = new Proxy(target.prototype , handler)
这不会发生。有任何想法吗 ?
解决方案
target.prototype = new Proxy(target.prototype , handler)
这将prototype
of设置target
为自身的代理。
Object.setPrototypeOf(
target.prototype,
new Proxy(target.prototype , handler)
);
这会将prototype
of设置target.prototype
为 的代理target.prototype
。然后你就有了一个循环依赖:Object.getPrototypeOf(target.prototype) == proxy(target.prototype)
,所以当 JavaScript 试图遍历原型链时,它会陷入反复调用代理处理程序的无限循环中。
反正我觉得Object.setPrototypeOf()
这里没有任何意义。该函数旨在设置实例的原型。您似乎正在尝试设置构造函数的原型,即constructor.prototype
在创建实例时将继承的对象new constructor
。您需要prototype
像在第一个代码段中一样直接分配构造函数的 。
推荐阅读
- javascript - Visual Studio 2019 Javascript - 如何引用应用程序根相对路径?
- django - 为“应用程序”目录结构注册自定义用户时遇到问题
- php - 检查 PHP 表单中的字符串,如果存在则不要发送表单并重定向到感谢页面
- hapi-fhir - 带有 Springdoc-openapi-ui 的 FHIR 模型
- java - 如何避免使用流和 if else 语句?
- ios - 在 Swift 中获取 iPhone 的蓝牙 PAN IP 地址
- ssh - 如何使用私钥创建 SSH 隧道
- dask - 从 REST API 并行加载数据帧
- events - C# WPF:获取我点击的位置/内容
- python - Discord Bot 不适用于 while 循环