如何使用装饰器向类添加函数

时间:2017-12-23 03:18:56

标签: javascript decorator es6-class ecmascript-next

我试图创建一个类装饰器,只是简单地向一个类添加一个函数(或属性),但没有快乐。

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 个答案:

答案 0 :(得分:0)

基于这些注释,并假设您将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!