Javascript 如何将动态方法名称添加到Ember.js对象?

Javascript 如何将动态方法名称添加到Ember.js对象?,javascript,coffeescript,ember.js,Javascript,Coffeescript,Ember.js,基本上我有很多非常相似的函数,只是函数名稍有不同,访问变量稍有不同 我不想重复我自己,而是想通过类似于Ruby中define_方法的东西来创建这些方法 有人知道如何在Ember.js对象中执行此操作吗?哦,最好是咖啡脚本 这显然是错误的,但只是一个非常基本的例子 Thing = Ember.Object.extend() animal = "cow" say = "moo" animal = "dog" say = "woof" Thing.reopenClass( this["#{ani

基本上我有很多非常相似的函数,只是函数名稍有不同,访问变量稍有不同

我不想重复我自己,而是想通过类似于Ruby中define_方法的东西来创建这些方法

有人知道如何在Ember.js对象中执行此操作吗?哦,最好是咖啡脚本

这显然是错误的,但只是一个非常基本的例子

Thing = Ember.Object.extend()

animal = "cow"
say = "moo"

animal = "dog"
say = "woof"

Thing.reopenClass(
this["#{animal}Speak"]: ->
console.log say
)

有人能帮忙吗?

重新打开类
只需要一个对象,您就可以构建该对象,然后将其交给
重新打开类

add_this = { }
add_this["#{animal}Speak"] = -> console.log say
Thing.reopenClass add_this
不幸的是,在为对象文字构建键时,不能使用字符串插值,因此以下情况很明显(但不正确):

给你一个语法错误

我认为问题的根源在于,带插值的字符串不是字符串文字,而是一个值为字符串的表达式。对象文本中的键必须是简单的无引号标签(
标签:
)或字符串文本(
字符串:
字符串:
)。当你这么说的时候:

"string with #{interpolation}"
你真的只是在用速记:

"string with " + interpolation
CoffeeScript编译器不够聪明,无法重写以下内容:

o = { "string with #{interpolation}": value }
如下所示:

o = { }
o['string with ' + interpolation] = value
因此,不能在CoffeeScript(或JavaScript)中使用字符串值表达式作为对象文本的键

o = { }
o['string with ' + interpolation] = value