生成原型方法

时间:2015-03-04 20:06:45

标签: coffeescript

我正在尝试在coffeescript类上生成方法,如下所示:

class Test
  log: (msg...) ->
    for m in msg
      console.log(m)

  for alias in ['one', 'two', 'three', 'four', 'five']
     Test::[alias] = (v...) ->
      o = {}
      o[alias] = v[0]
      Test::log.apply(@, [o].concat(v.slice(1)))

t = new Test()
t.one(1)
t.two(3)

由于完全逃避我的原因,这打印出来

{ five: 1 }
{ five: 2 }

而不是我的预期,是:

{ one: 1 }
{ two: 2 }

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

问题是您在alias循环的每次迭代中将for变量绑定到新值。因此,当调用t.one(1)方法alias时,变量绑定到'five'

有两种方法可以解决这个问题。

首先解决方案是使用Array.prototype.forEach()

['one', 'two', 'three', 'four', 'five'].forEach (alias) ->
  Test::[alias] = (v...) ->
    // ..

第二个解决方案是使用coffee-script do语句创建一个闭包:

for alias in ['one', 'two', 'three', 'four', 'five']
  Test::[alias] = do (alias) -> (v...) ->
    // ..