动态扩展CoffeeScript类

时间:2013-04-06 22:18:53

标签: coffeescript

我知道可以像这样扩展CoffeeScript类:

Dog::bark = ->
  console.log("bark")

我希望能够动态地执行此操作。例如,我想做这样的事情:

sounds = [ "bark", "woof", "grrr", "ruff" ] 

for sound in sounds
  Dog::[sound] = ->
    console.log(sound)

等效的JavaScript将是:

var sounds = [ "bark", "woof", "grrr", "ruff" ];

for (var i = 0; i < sounds.length; i++) 
{
  var sound = sounds[i];

  Dog.prototype[sound] = function() {
    console.log(sound);
  };
}

如何使用CoffeeScript执行此操作?

1 个答案:

答案 0 :(得分:4)

你几乎拥有它,你只需要在其中抛出一个do来强制sound在构建新方法时进行评估:

sounds = [ "bark", "woof", "grrr", "ruff" ] 
for sound in sounds
    do (sound) ->
        Dog::[sound] = -> console.log(sound)

如果您不包含do,那么您最终将使用console.log('ruff')的所有四种方法。添加do会将for循环体转换为自执行函数。从fine manual(本节底部):

  

当使用JavaScript循环生成函数时,通常会插入一个闭包装,以确保循环变量被关闭,并且所有生成的函数不只是共享最终值。 CoffeeScript提供do关键字,它立即调用传递的函数,转发任何参数。

演示:http://jsfiddle.net/ambiguous/YAqJu/