Как добавить функцию в класс с помощью декоратора

Я пытаюсь создать декоратор класса, который просто добавляет функцию (или действительно свойство) к классу, но без радости.

const findDecorator = () => {
  return (constructor) => {
    constructor.prototype.findMe = () => console.log('You found me!')
  }
}

Я также пытался использовать target.prototype шаблон и некоторые другие вещи, но бесполезно. У кого-нибудь есть простой пример того, как это сделать? Кстати, я также расширяю класс:

@findDecorator()
export default class MyClass extends OtherClass {
  shouldFireFirst () {
    this.findMe()
  }
}

РЕДАКТИРОВАТЬ: На самом деле, похоже, проблема в том, что функция доступна в экземпляре, но не в объявлении класса.

1 ответ

Основываясь на комментариях и предполагая, что вы используете Babel вместе с babel-plugin-transform-decorators-legacyчто вы пытаетесь сделать, это добавить новые методы в целевой класс. Для этого вам нужно расширить целевой класс в декораторе, например так:

const findDecorator = (target) => {
   return class extends target {
        constructor(...args) {
            super();
        }

        findMe() { console.log('You found me!') }
    };
}

@findDecorator
export default class MyClass extends OtherClass {
  shouldFireFirst () {
    this.findMe()
  }
}

new MyClass().shouldFireFirst()  // => You found me!

Если вам нужно передать параметры вашему декоратору, вы также можете сделать это:

const findDecorator = (name) => (target) => {
   return class extends target {
        constructor(...args) {
            super();
            this.name = name
        }

        findMe() { console.log(`You found ${this.name}!`) }
    };
}

@findDecorator('Waldo')
export default class MyClass extends OtherClass {
  shouldFireFirst () {
    this.findMe()
  }
}

new MyClass().shouldFireFirst()  // => You found Waldo!
Другие вопросы по тегам