Javascript CoffeeScript返回错误的原型

Javascript CoffeeScript返回错误的原型,javascript,coffeescript,Javascript,Coffeescript,在下面的这段代码中,我创建了一个Test对象,并将其存储在一个数组中。我编写了一个按名称检索测试对象并返回它的方法,但它返回数组原型,而不是测试原型。我已经附上下面的示例代码和一个代码笔。我做错了什么?我如何尝试修复它 class TestHandler constuctor: -> testList: [] addTest: (test) -> @testList.push test getTestList: ->

在下面的这段代码中,我创建了一个
Test
对象,并将其存储在一个数组中。我编写了一个按名称检索测试对象并返回它的方法,但它返回
数组
原型,而不是
测试
原型。我已经附上下面的示例代码和一个代码笔。我做错了什么?我如何尝试修复它

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:

您没有返回实际对象,而是返回列表理解,您需要显式地从列表理解返回

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

当函数体的最后一条语句是
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

它不返回任何原型对象?但,是的,它返回一个具有该名称的对象数组——正如您告诉它的那个样。否,它返回一个
数组的原型对象。我告诉它抓取一个特定的对象,但不返回附加到该特定对象的原型。那么我该如何返回实际的对象呢?我对原型继承几乎没有经验,来自Java,这让我非常困惑。这与原型无关,这是coffeescript的工作原理。Coffeescript认为,
getTestForName
函数的最后一行是该迭代,因为Coffeescript具有隐式返回(即返回函数体最后一行上的任何内容),所以它只会返回该值。例如,这个特性在Ruby中最为流行。天哪,这真是太棒了!这两天来,我一直在绞尽脑汁,没想到它会以数组的形式返回for循环!这种隐性回报真的会扰乱我的大脑逻辑。非常感谢你!需要说明的是,“当函数体的最后一个语句是for循环时”并不完全正确。最后一行的任何语句都将隐式返回。correct。它也适用于列表理解。或者,如果在函数末尾执行类似于
console.log
语句的操作,它将返回void,这同样令人困惑。