2

所以基本上我有许多非常相似的函数,但函数名称略有不同,访问的变量也略有不同。

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

任何人都知道如何在 Ember.js 对象中执行此操作?哦,最好是 CoffeeScript!

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

Thing = Ember.Object.extend()

animal = "cow"
say = "moo"

animal = "dog"
say = "woof"

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

有人能帮忙吗?

4

1 回答 1

2

reopenClass只需要一个对象,这样您就可以构建该对象,然后将其交给reopenClass

add_this = { }
add_this["#{animal}Speak"] = -> console.log say
Thing.reopenClass add_this

不幸的是,在为对象文字构建键时不能使用字符串插值,所以很明显(但不正确):

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

给你一个语法错误。

我认为问题的根源在于带有插值的字符串不是字符串文字,它是一个值为字符串的表达式。对象文字中的键必须是简单的不带引号的标签 ( label:) 或字符串文字 ( 'string':or "string":)。当你这样说时:

"string with #{interpolation}"

您实际上只是为此使用了简写:

"string with " + interpolation

CoffeeScript 编译器不够聪明,无法重写:

o = { "string with #{interpolation}": value }

作为这个JavaScript:

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

因此,您不能将字符串值表达式用作 CoffeeScript(或 JavaScript)中对象文字的键。

于 2012-11-01T21:42:42.797 回答