ES6传递函数作为参数示例

时间:2019-01-27 03:50:23

标签: javascript lambda ecmascript-6 functional-programming

我不太了解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可以实现这种功能吗?
请显示可以通过构造函数将具有不同种类和不同参数数量的函数传递给DoTheJob()的ES6代码。

此外,挑战在于jobFn必须是 Curried 函数,这意味着缺少一个或多个参数来执行{{1 }}工作。假设DoTheJob Curried jobFn一起传递,则add(3)将执行DoTheJob的UncurriedAdd;如果然后add(3, 6) Curried jobFn一起传递,则multiple(5)将对DoTheJob执行Uncurried;

2 个答案:

答案 0 :(得分:4)

只需将传递的函数分配给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函数的数据来调用,只需在传递的函数中定义所需的参数,就无需在这里进行实际操作:< / p>

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');

答案 1 :(得分:0)

就我而言,我可能建议您最好将谓词赋予article = Article.objects.all() ,因为这样您就可以重用相同的实例并提供不同的谓词。

无论如何,使用JavaScript方法(即鸭子输入法)多态方法,对此有一个纯OOP解决方案:

article = get_object_or_404(Article, slug=self.kwargs['slug'])