Javascript 如何将动态方法名称添加到Ember.js对象?
基本上我有很多非常相似的函数,只是函数名稍有不同,访问变量稍有不同 我不想重复我自己,而是想通过类似于Ruby中define_方法的东西来创建这些方法 有人知道如何在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
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