Javascript 如何访问构造函数';这';在拉姆达里面?

Javascript 如何访问构造函数';这';在拉姆达里面?,javascript,ecmascript-6,ramda.js,Javascript,Ecmascript 6,Ramda.js,每当我试图访问Ramda Compose函数(R.Compose)中的任何this)时,我都会得到未定义的,可能是因为this被“绑定”到Ramda Compose函数 我如何使这个访问在类构造函数中启动的内容 此.state在下面代码中的getContent中未定义: export default class FaqStore { constructor() { this.state = new FaqState() this.getParents() } ge

每当我试图访问Ramda Compose函数(
R.Compose
)中的任何
this
)时,我都会得到
未定义的
,可能是因为
this
被“绑定”到Ramda Compose函数

我如何使
这个
访问在
构造函数中启动的内容

此.state
在下面代码中的
getContent
中未定义:

export default class FaqStore {
  constructor() {
    this.state = new FaqState()

    this.getParents()
  }

  getContent = R.concat(this.state.parents, R.prop('content'))
  getParents = FaqService.getParents().then(this.getContent)

您似乎正在使用公共类字段。以这种方式创建的属性是(步骤8和11)

即,您的代码等同于

export default class FaqStore {
  constructor() {
    this.getContent = R.concat(this.state.parents, R.prop('content'))
    this.getParents = FaqService.getParents().then(this.getContent)

    this.state = new FaqState()

    this.getParents()
  }
}
这清楚地表明,您正试图在初始化前访问此.state

可能的解决方案

初始化
此后,不要使用建议并直接在构造函数中设置属性。状态

export default class FaqStore {
  constructor() {
    this.state = new FaqState()

    this.getContent = R.concat(this.state.parents, R.prop('content'))
    this.getParents = FaqService.getParents().then(this.getContent)

    this.getParents()
  }
}

然而,仍然存在一个问题:分配给
getParents
的值是一个承诺。您不能调用承诺(
this.getParents()
)。也许您真正想要的是为
getParents
分配一个函数:

this.getParents = () => FaqService.getParents().then(this.getContent)
而且可能
R.concat
也不返回函数,在这种情况下
this.getContent
也不能调用。在这种情况下,你真正想要的是

export default class FaqStore {
  constructor() {
    this.state = new FaqState()

    this.getParents()
  }

  getContent = () => R.concat(this.state.parents, R.prop('content'))
  getParents = () => FaqService.getParents().then(this.getContent)
}

i、 e.将函数分配给
getContent
getParents

Felix Kling的答案非常好。不过,我想从Ramda中添加更多的上下文

Ramda(免责声明:我是作者之一)是关于函数式编程的。它试图做两件事:让Javascript开发人员更容易转向更标准的FP实践,以及让FP语言的用户更容易使用Javascript。根本不强调与面向对象的编码风格的互操作

Ramda曾试图确保它的某些函数确实维护了
这个
上下文,这将允许它们被用作OOP方法。但我们正在完全放弃这种关注;它一直都是推测性的,根本没有任何要求,当我们不小心因为某些功能而破坏了它时,我们没有任何抱怨。这似乎没有什么理由。同时,它使我们的实现复杂化,影响性能。因此,当我们发现需要重写函数时,我们不再试图确保这一点得到维护

这是有道理的。有些人将拉姆达视为下划线或洛达斯的替代品,但这似乎总是偏向于我们。这些库引入了一些FP概念,但它们被设计为在多范式环境中工作,对命令式、OOP或FP代码库同样满意。Ramda则不同,它的设计目的是只在功能系统中工作良好。它完全围绕着通过组合纯函数来构建系统的概念而构建


基于这些原因,除了Felix所说的一切之外,没有真正的理由期望Ramda函数能够维护您的
this
上下文。

这是什么语法?代码不完整,看起来不像ES6。如果您使用的是公共类属性方案,则在设置
此.state
之前,可能会对
R.concat(this.state.parents,R.prop('content'))
进行评估。解决方案:在分配
this.state
之后,将
getContent
getParents
分配移动到构造函数中。当然不会返回函数:-)我猜OP的意思是
R.compose(R.concat(this.state.parents),R.prop('content'))