Правильный способ динамического добавления функций в классы ES6

У меня есть простой класс с единственным методом exec(arg1,..,argn), и я хочу иметь несколько методов псевдонимов, которые вызывают exec с предопределенными значениями аргументов (например, exec_sync = exec.bind(this, true)).

Ниже приведен трюк:

class Executor {
  constructor() {
    this.exec_sync = this.exec.bind(this, true);
  }

  exec(sync, cmd, args/* ... */) {
    // impl
  }
}

Но Я не знаю, хорошая ли это идея, или это идиоматично для ES6.

UDATE:

В реальном примере у меня есть две вложенные петли с соответственно 3 и 4 циклами, которые используются для динамического добавления в класс всего 12 методов псевдонимов. Было бы громоздкой задачей явно определять методы псевдонимов, когда вы действительно можете использовать JS, являющийся языком программирования на основе прототипа.

ОБНОВЛЕНИЕ 2 - ПРИМЕР:

Предположим, что у нас есть простой HTTP-клиент с методом request(method, body), и мы хотим предоставить методы псевдонимов для GET, PUT и т.д. Это будет выглядеть примерно так:

class HTTP {
  constructor() {
    ['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
      this[method] = this.request.bind(this, method);
    }, this);
  }

  request(method, body) {
    // execute the HTTP request
  }
}

Ответ 1

Ваше решение прекрасно, хотя лучше будет создавать все эти методы один раз на уровне prototype:

['GET', 'PUT', 'POST', 'DEL'].forEach((method) => {
  Executor.prototype[method] = function (body) {
    return this.request(method, body)
  }
})

prototype подход немного быстрее, потому что этот код выполняется только один раз, а код конструктора выполняется каждый раз, когда создается новый экземпляр.

Другим преимуществом prototype over constructor является то, что он совместим с наследованием классов. Итак, если вы продляете свой класс позже, ничто не сломается, даже если вы переопределите любой из этих методов.

Кстати, вы можете использовать require('http').METHODS или methods package вместо жестко закодированного массива HTTP-глаголов здесь.

Ответ 2

Я не знаю, что это идиоматично (поскольку это больше касается дизайна, а не самого языка программирования), но я лично думаю, что создание явных функций будет лучше:

exec_sync(...args) {
    return this.exec(true, ...args); 
}