我环顾四周,找到了一些问题,这些问题接近using-a-string-to-define-the-class-name和dynamic-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
答案 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()
等代码(取决于您是否将它们附加到根目录)。