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

CoffeeScript generating dynamic variable names for objects (named classes)

本文关键字:动态 变量名 对象 CoffeeScript      更新时间:2023-09-26

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

假设我有一个这样的 CoffeeScript 类

class @Model
  constructor: (@name) ->

如何将要创建的模型的名称传递给函数以实例化这些对象,同时将变量的名称(在本例中)附加到_model?像这样:

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

我的rails应用程序告诉我:

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

我假设这是因为字符串。有没有某种方法可以将字符串转换为变量名?我快速浏览了一下.eval()方法,但CoffeeScript的小书警告不要使用它。

谢谢

你可以做这样的事情:

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 中,可以使用方括号 ([]) 表示法、字符串或包含字符串的变量,以字符串形式访问对象的属性。在这里,我们将它与 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