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