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

标签 javascript typescript decorator es6-proxy

我有一个 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/

相关文章:

javascript - 编辑大量内容的大型(大概)应用程序

javascript - 在代码行中使用 join()

c# - 装饰器模式 - 从装饰器访问包装对象中的值

c# - 如何管理装饰 ApiController 中的重复?

javascript - 火存储 : How to update a document's field that is a document reference?

javascript - jqGrid如何覆盖 "view"m

javascript - 设置复选框节点列表的选中状态

javascript - 从 Electron 函数传回数据

angular - IONIC 中没有 MapsAPILoader 的提供者

python - 如何在 Flask 中使用参数制作 python 装饰器函数(用于授权)