Proxy ES6 класс и поддержка прототипа цепи - PullRequest
0 голосов
/ 22 февраля 2019

Я проксирую методы, используя следующую обертку:

  public static wrap(target) {
    function construct(constructor, args) {
      const c: any = function(this) {
        return constructor.apply(this, args);
      };

      c.prototype = constructor.prototype;
      return new c();
    }

    const f = (...args) => {
      const instance = construct(target, args);

      const descriptors = getMethodDescriptors(target, instance);

      return new Proxy<T>(
        instance,
        new SomeProxyHandler(descriptors)
      );
    };

    f.prototype = target.prototype;
    return f;
  }

Это хорошо сработало при переносе классов, скомпилированных до ES5, но теперь я пытаюсь нацелиться на ES6. Я получаю ошибки вconstructor.apply(this, args) говоря, что:

TypeError: Class constructor OneOfMyClasses cannot be invoked without 'new'

Как я могу исправить этот код, чтобы wrap мог прокси-классы независимо от цели JavaScript и поддерживать правильную цепочку прототипов?

1 Ответ

0 голосов
/ 25 февраля 2019

Самым простым способом будет распространение синтаксиса

const instance = new target(...args);

, но вы также можете использовать Reflect.construct:

const instance = Reflect.construct(target, args);

Это даже будет необходимо, если вашобернутые классы должны быть расширяемыми, тогда вам придется использовать new.target:

const instance = Reflect.construct(target, args, new.target);

Кстати, ваша оболочка f должна быть правильное function не функция стрелки , поскольку они не могут быть вызваны с помощью new (и не имеют new.target).Или, может быть, даже проще (лучше работает со статическими методами и наследованием), просто оберните весь класс target в Proxy и используйте его construct trap .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...