实现JS装饰器以链接Class方法

时间:2019-02-19 01:58:22

标签: javascript ecmascript-next

如何实现一个装饰器,使一个类的所有方法可自动链接?

我有以下课程:

class MyClass {
  async foo() { console.log(1); }
  async bar() { console.log(2); }
}

我希望能够执行以下操作:

@chainableMethods
class MyClass {
  ...
}

const myInstance = MyClass();

myInstance
  .foo()
  .bar();

1 个答案:

答案 0 :(得分:-1)

您可以尝试

function chainableMethods (constructor) {
  let funcs = Object.getOwnPropertyNames(constructor.prototype);
  for (var i in funcs) {
    let func = funcs[i];
    let oldFunc = constructor.prototype[func];
    constructor.prototype[func] = (...args) => {
      let result = oldFunc.apply(this, args);
      return result || constructor.prototype;
      // Using 'result ||' for cases when a function does return something useful
      // You can remove it if it doesn't suit your requirement. 
    }
  }
}

如果您只打算在解决bar的承诺后才运行foo,那么我认为这是不可能的。