Как добавить функцию в класс с помощью декоратора
Я пытаюсь создать декоратор класса, который просто добавляет функцию (или действительно свойство) к классу, но без радости.
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!