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,这同样令人困惑。