Как украсить класс веб-компонента - PullRequest
0 голосов
/ 31 августа 2018

Я создаю декоратор @Component, который заменяет конструктор класса для выполнения некоторой работы после построения. Как видно из следующего кода, работа выполняется методом init.

export function Component (Cls) {
  function Class (...args) {
    let self = new Cls (...args); // (1)
    init (self, ...args);
    return self;
  }
  Class.prototype = Cls.prototype;
  return Class;
}

Когда я тестирую этот код в обычном классе, все работает нормально. Это рабочий пример:

class Base { ... }

@Component
class Core extends Base {
  constructor () {
    super (); // init is invoked
  }
  fx () { console.log ('Core.fx') }
  fy () { console.log ('Core.fy') }
}

Тем не менее, когда я пытаюсь украсить веб-компонент, появляется сообщение TypeError: Illegal constructor.

@Component
class Core extends HTMLElement {
  constructor () {
    super ();
  }
  fx () { console.log ('Core.fx') }
  fy () { console.log ('Core.fy') }
}
customElements.define ('x-core', Core);

let coreX = document.createElement ('x-core');
document.body.appendChild (coreX);

Я понимаю, что проблема в том, что HTMLElement не поддерживают прямое построение через оператор new - см. (1) в первом листинге - но мне нужна процедура для украшения конструктора любого класса, даже если они являются пользовательскими элементами.

Какая-то идея?

Рабочие настройки: Chrome 68 · Babel 7.0.0-beta.51 с babel-plugin-transform-decorators-legacy

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете вернуть класс, чтобы избежать прямого new.

function Component(cls) {
  class c extends cls {
    constructor() {
      super()
      console.log(this)//init
    }
  }
  return c
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...