我知道可以像这样扩展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执行此操作?
答案 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
关键字,它立即调用传递的函数,转发任何参数。