CoffeeScript为对象生成动态变量名称(命名类)

时间:2014-04-08 16:21:27

标签: javascript ruby-on-rails coffeescript

我对JavaScript的世界很新,甚至更新到CoffeeScript。我有一个问题,我不确定它是否可能。

说我有像这样的CoffeeScript类

class @Model
  constructor: (@name) ->

如何将要创建的模型名称传递给函数以实例化这些对象,同时使用_model附加变量[在本例中]的名称?类似的东西:

makeModel = (name) ->
  "#{name}_model" = new Model(name)

我的rails应用程序告诉我:

unexpected =
      "#{name}_model" = new Model(
                ^

我假设这是因为字符串。是否有某种方法将字符串转换为变量名?我快速查看了.eval()方法,但the little book of CoffeeScript警告不要使用它。

由于

1 个答案:

答案 0 :(得分:2)

你可以这样做:

ModelFactory = do -> 
  class @Model
    constructor: (@name) ->

  models = {}

  makeModel = (name) ->
    model = new Model(name)
    models["#{name}Model"] = model
    model

  getModel = (name) ->
    models["#{name}Model"] or makeModel(name)

  { getModel }

秘密魔法:

do -> - do关键字会创建一个IIFE,这个函数会在创建后立即调用。它可用于创建如下模块:

var myModule = (function () {
    var privateFunc = function () {};
    var publicFunc = function () { privateFunc(); };
    return {
        publicFunc: publicFunc
    }
})();

使用字符串访问属性 - 在JavaScript中,您可以使用square-bracket ([]) notation,字符串或包含字符串的变量,以字符串形式访问对象的属性。在这里,我们将它与CoffeeScript字符串插值糖("#{}")相结合,以动态创建属性名称并分配它们。

var object = {
    prop: 'value',
    otherProp: 'otherValue'
};

var propertyName = 'prop';
var value = object[propertyName]; // 'value';

var something = 'Something'
object['my' + something] = 'a new property';
object.mySomething === 'a new property'; // true