首页 > 解决方案 > 使用 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)

这不会发生。有任何想法吗 ?

标签: javascripttypescriptdecoratores6-proxy

解决方案


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

这将prototypeof设置target为自身的代理。

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

这会将prototypeof设置target.prototype为 的代理target.prototype。然后你就有了一个循环依赖:Object.getPrototypeOf(target.prototype) == proxy(target.prototype),所以当 JavaScript 试图遍历原型链时,它会陷入反复调用代理处理程序的无限循环中。


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


推荐阅读