【问题标题】:CoffeeScript generating dynamic variable names for objects (named classes)CoffeeScript 为对象(命名类)生成动态变量名
【发布时间】:2015-10-20 03:28:58
【问题描述】:

我对 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 警告不要使用它。

谢谢

【问题讨论】:

  • 代替命名变量,使用数组或对象来收集实例...
  • 我没想到。作为最后的手段,这是可能的,但由于这些元素都存储在数据库中,因此通过名称与它们进行交互比维护数组要方便得多
  • all.fred_model 比 window.fred_model 甚至 fred_model 更容易使用吗?另外,如果它们在一个对象中,you8 可以迭代所有实例,这会导致变量混乱。我还会考虑将它们作为静态对象属性附加到构造函数本身。
  • 再次,对于 JS 和 CS 的新手,您介意使用某种代码示例进行扩展吗?关键是我可能不需要遍历所有模型,但我可能需要直接定位 current_model = fred_model 对不起,在这里完成新手!
  • 我不知道它在 CoffeeScript 中的样子,但是由于分配泄漏,您可以在普通 JS 中的“var xxx=”之后添加一个附加分配。类似“var xxx= self[name]= ...”

标签: javascript ruby-on-rails coffeescript


【解决方案1】:

你可以这样做:

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

【讨论】:

  • 这看起来是一个很好的解决方案,谢谢。虽然有两件小事,但我真的不喜欢在不知道代码在做什么的情况下使用解决方案。我想你不知道我在哪里可以阅读ModelFactory = do -> 业务以及整个使用字符串作为数组中的索引 (models["#{name}Model"])
  • 谢谢,太好了!没有什么比早餐前上学更好的了
猜你喜欢
  • 2012-10-28
  • 2010-12-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多