【问题标题】:CoffeeScript returns wrong prototypeCoffeeScript 返回错误的原型
【发布时间】:2014-11-13 18:09:44
【问题描述】:

在下面的这段代码中,我创建了一个Test 对象并将其存储在一个数组中。我写了一个方法来按名称检索测试对象并返回它,但它返回的是Array原型,而不是Test原型。我附上了下面的示例代码和一个codepen。我做错了什么以及如何尝试解决它。​​

class TestHandler
    constuctor: ->

    testList: []

    addTest: (test) ->
      @testList.push test

    getTestList: ->
      @testList

    getTestForName: (name) ->
      for e in @getTestList() when e.getName() is name
        e

class Test
  constructor: (name) ->
    @name = name

  getName: ->
    @name

testHandler = new TestHandler()
testHandler.addTest new Test 'hi'


console.log testHandler.getTestForName 'hi'

Codepen:http://codepen.io/anon/pen/EaxyrX

【问题讨论】:

  • 它不返回任何原型对象?但是,是的,它返回一个具有该名称的对象数组 - 正如你告诉它的那样。
  • 不,它返回一个原型对象Array。我告诉它抓取一个特定对象,但不返回附加到该特定对象的原型。

标签: javascript coffeescript


【解决方案1】:

您返回的不是实际对象而是列表推导,您需要从列表推导中显式返回

getTestForName: (name) ->
    for e in @getTestList() when e.getName() is name
        return e

【讨论】:

  • 那么我将如何返回实际对象呢?我对原型继承的经验很少,而且来自 Java,这让我很困惑。
  • 这与原型无关,coffeescript 是这样工作的。 Coffeescript 认为 getTestForName 函数的最后一行是该迭代,并且由于 Coffeescript 具有隐式返回(即返回函数体最后一行的任何内容),它只会返回它。例如,这一特殊功能在 Ruby 中最为普遍。
【解决方案2】:

当函数体的最后一条语句是for 循环时,coffeescript 将整个循环作为返回值。实际上,在coffeescript 中,for 循环本身就是一个值,它的元素是for 主体中的最后一行。所以你可以做这样的事情

x = for i in [0...3]
  console.log('i is', i);
  3 * i

x 设置为[0, 3, 6]。同样,如果我们有

f = ->
  for i in [0...3]
    3 * i

然后f() 将返回[0, 3, 6]。一个简单的解决方法是

getTestForName: (name) ->
  for e in @getTestList() when e.getName() is name
    return e

【讨论】:

  • 天啊,这太棒了!这两天我一直在努力解决这个问题,从没想过它会将 for 循环作为数组返回!隐式返回真的会扰乱我的大脑逻辑。非常感谢!
  • 需要明确的是,“当函数体的最后一条语句是 for 循环时”并不完全正确。最后一行的任何语句都会被隐式返回。
  • 正确。它也适用于列表推导。或者如果你在函数末尾做类似console.log 语句的事情,它会返回void,这同样令人困惑。
猜你喜欢
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多