Функция прохода ES6 в качестве примера параметра - PullRequest
0 голосов
/ 27 января 2019

Я не знаю JS / ES6 достаточно хорошо, чтобы описать мой вопрос в коде.Таким образом, большая часть этого вопроса концептуально и в псевдокоде.

Скажем, у меня есть класс Contractor, подобный этому:

class Contractor {
 constructor(jobFn) {
    // save jobFn;
  }

  dailyRoutine() {
    // let result = DriveToWork()
    const result = 6
    DoTheJob(result)
    DriveBackHome()
  }

}

Проблема в том, что DoTheJob() может быть разными вещами в разных местах.

Таким образом, в месте A это может быть

he = new Contractor(write_front_end(with, this, and that))

И в месте B это может быть

he = new Contractor(fix_backend_node(with, express))

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

Возможно ли такое с ES6?
Пожалуйста, покажите код ES6, который может передавать функции с разным типом и различным количеством параметров через конструктор, на DoTheJob().

Далее,проблема заключается в том, что jobFn должна быть функцией Curried , что означает, что для выполнения задания DoTheJob отсутствует один или несколько параметров.Скажем, если jobFn передано с Curried add(3), тогда DoTheJob сделает UncurriedAdd из add(3, 6);если тогда jobFn будет передано с Curried multiple(5), тогда DoTheJob сделает Uncurried из multiple(5, 6);

Ответы [ 2 ]

0 голосов
/ 27 января 2019

В моем случае я могу сообщить вам, что лучше дать предикат dailyRoutine, потому что таким образом вы сможете повторно использовать один и тот же экземпляр и давать разные предикаты.

Во всяком случае, для этого есть чистое ООП-решение, использующее метод полиморфизма, способ JavaScript (он же утка):

class Contractor {
  driveBackHome() {}

  dailyRoutine() {
    const result = 6

    this.doTheJob(result)
    this.driveBackHome()
  }
}

class SpecializedContractorA extends Contractor {
  doTheJob(result) {
    console.log('aaaaaaaaaaaaaaaaaaaaa', result)
  }
}

class SpecializedContractorB extends Contractor {
  doTheJob(result) {
    console.log('bbbbbbbbbbbbbbbb', result)
  }
}

const a = new SpecializedContractorA()
a.dailyRoutine()

const b = new SpecializedContractorB()
b.dailyRoutine()
0 голосов
/ 27 января 2019

Просто присвойте переданную функцию this.DoTheJob, а затем вызовите this.DoTheJob внутри dailyRoutine:

class Contractor {
  constructor(jobFn) {
    this.DoTheJob = jobFn;
  }
  dailyRoutine() {
    // DriveToWork()
    this.DoTheJob();
    // DriveBackHome()
  }
}

const c1 = new Contractor(() => console.log('doing job A'));
c1.dailyRoutine();

const c2 = new Contractor(() => console.log('doing job B'));
c2.dailyRoutine();

// c1 again:
c1.dailyRoutine();

// feel free to reference any in-scope variables in the passed function,
// no need to pass the variables as additional parameters
const data = 'data';
const c3 = new Contractor(() => console.log('data is', data));
c3.dailyRoutine();

Если dailyRoutine необходимо вызвать с данными, которые необходимо отправить в переданную функцию doTheJob, просто определите необходимые аргументы в передаваемой функции, здесь нет необходимости для фактического каррирования:

class Contractor {
  constructor(jobFn) {
    this.DoTheJob = jobFn;
  }
  dailyRoutine(doJobArg) {
    this.DoTheJob(doJobArg);
  }
}

// feel free to reference any in-scope variables in the passed function,
// no need to pass the variables as additional parameters
const data = 'data';
const c3 = new Contractor((arg) => console.log('data is', data, 'and arg is', arg));
c3.dailyRoutine('argDoTheJobIsCalledWith');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...