【问题标题】:Create ES6 Class Methods from other class methods从其他类方法创建 ES6 类方法
【发布时间】:2017-03-20 08:34:05
【问题描述】:

所以我有一个带有柯里化方法的类

class myClass {
  constructor () {}

  curry (a,b) {
    return (a,b) => {}
  }

}

现在可以用咖喱创建另一种方法吗?像这样的

class myClass {
  constructor () {}

  curry (a,b) {
    return (a,b) => {}
  }

  newMethod = curry()
}

【问题讨论】:

  • 我不认为“currying”是正确的术语。 “返回函数的方法”会更精确。
  • @JLRishe 我认为他的意思是柯里化,这是函数式编程。在 ES6 类中,实例总是被返回,所以我认为他的问题的答案是“否”。
  • @JLRishe 我可以创建一个返回函数的方法,我的问题是“我可以从返回函数的方法中创建一个方法吗?”
  • 您可以将任何函数作为方法添加到对象。不知道这个问题是关于什么的。
  • @NielsSteenbeek Currying 是一种允许将函数调用分解为一系列单参数调用的机制。 OP 的示例采用两个参数,因此这不是柯里化。我认为如果 OP 跳过花哨的术语并用清晰的语言解释他们的要求,这个问题可能会更好。

标签: javascript ecmascript-6 currying es6-class


【解决方案1】:

是的,您可以轻松做到这一点 - 只需将其放入构造函数中即可:

class MyClass {
  constructor() {
    this.newMethod = this.curriedMethod('a') // partial application
  }

  curriedMethod(a) {
    return (b) => {
      console.log(a,b);
    }
  }
}

let x = new MyClass();
x.newMethod('b')

【讨论】:

  • 这里有一个问题。 curried 函数现在在类属性中,它不是真正的方法。不同之处在于,在类初始化之前,方法确实存在。虽然在大多数情况下这听起来像是吹毛求疵,但如果您需要对课程进行静态分析,情况就会发生变化。 (例如角度AOT编译)
  • @SanderElias 根据使用this 关键字的调用,您还可以使用const makeMethod = (a) => function(b) { console.log(a, b, this); };MyClass.prototype.newMethod1 = makeMethod(1); MyClass.prototype.newMethod2 = makeMethod(2); 来获取真正的类方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 2013-01-27
  • 2020-02-02
相关资源
最近更新 更多