【问题标题】:How can I add a dynamic method name to an Ember.js object?如何向 Ember.js 对象添加动态方法名称?
【发布时间】:2012-10-22 12:57:47
【问题描述】:

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

我不想重复自己,而是想通过类似于 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
)

有人可以帮忙吗?

【问题讨论】:

    标签: javascript coffeescript ember.js


    【解决方案1】:

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

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

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

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

    给你一个语法错误。

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

    "string with #{interpolation}"
    

    您实际上只是在使用简写:

    "string with " + interpolation
    

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

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

    作为这个 JavaScript:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2011-02-25
      • 2015-12-12
      • 2021-12-30
      • 2021-09-11
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多