使用coffeescript从字符串动态生成新的命名类

时间:2013-05-19 22:07:34

标签: coffeescript

我环顾四周,找到了一些问题,这些问题接近using-a-string-to-define-the-class-namedynamic-class-generation-in-coffeescript>,但它们都没有完全解决我的问题,所以我想知道我是否在我的方法中犯了一些根本性的错误。问题。

在下面的循环中,我循环遍历从JSON解析的一些数据。对于每组数据,我希望将class Robot扩展为string = new Robot,其中string是一个字符串。

目前我的代码不会产生任何错误,并且成功创建了新的Robots,但由于他们的名字是字符串,因此尝试使用robot1.move()robot2.doSomeOtherClassyThing()访问它们不起作用并告知我,他们是未定义的。

这似乎不应该需要一个详细的辅助函数来使它工作。我在这里缺少什么?

 createRobots: -> # process robot commands
        createXcoord = missionData.xCoord
        createYcoord = missionData.yCoord
        createOrient = missionData.orientation
        createInstru = missionData.robotInstructions
        for command in createOrient
          robot = 'robot' + (_i + 1)
          name = robot
          robot = new Robot \ # create named Robot 
            name
          , createXcoord[_i] 
          , createYcoord[_i] 
          , createOrient[_i] 
          , createInstru[_i]
          console.log(robot)

我认为发生的事情是在声明"robot = 'string'时写入变量robot = new Robot

我希望的结果是string1 = new Robot"string2 = new Robot"。那有意义吗? jsfiddle.net/7EN5y/1

1 个答案:

答案 0 :(得分:2)

您需要将它们添加到上下文中。如果您希望它们是全局的,请创建一个如下变量:

# Either the browser root, or the CommonJS (e.g. Node) module root
root = window or exports

如果您想要一个拥有机器人的对象,请将此类对象添加到根目录。

root.robots = []

然后在创建机器人时,将它们添加到这样的对象中。

robot = 'robot' + (_i + 1)
name = robot
robot = new Robot # ...
root[name] = robot # or robots[name] = robot

然后,您可以使用robot1.move()robots.robot1.move()等代码(取决于您是否将它们附加到根目录)。