Реализация JS-декоратора для цепочки методов класса - PullRequest
0 голосов
/ 19 февраля 2019

Как я могу реализовать декоратор, который делает все методы класса автоматически сцепляемыми?

У меня есть следующий класс:

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

Я хочу иметь возможность делать следующее:

@chainableMethods
class MyClass {
  ...
}

const myInstance = MyClass();

myInstance
  .foo()
  .bar();

1 Ответ

0 голосов
/ 19 февраля 2019

Вы можете попробовать это

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, тогда я не думаю, что это будет возможно.

...