我正在尝试组织我的代码,但是有未定义的超类问题。我希望这只是一个负载路径问题,但我无法弄明白。我正在运行:
coffee rooms.coffee
rooms.coffee
Room = require('./rooms/room')
module.exports = class Rooms extends Object
constructor: ->
@
房间/ room.coffee
module.exports = class Room
@Active: require('./active')
constructor: (@id) ->
@users = {}
房间/ active.coffee
Room = require('./room')
console.log Room #=> {}
module.exports = class Active extends Room
constructor: (@id) ->
@type = "Active"
super
如果我尝试new Active
,我会收到以下错误:
TypeError: Cannot read property 'constructor' of undefined
Active
的{{1}}列为super
:
undefined
为什么[Function: Active] __super__: undefined
未定义? (或者更确切地说,只是一个空的对象?)
更新
这是由循环依赖造成的,正如下面的许多人所指出的那样。我最后只是将子类定义放在基类定义中,而不是尝试将它们保存在单独的文件中。像这样:
Room
答案 0 :(得分:2)
这种情况下,将代码简化为最原始的部分(同时仍然看到错误)是很有启发性的。如果我们删除了需求并删除了大部分代码,我们可以得到这样的结构:
class Room
@foo = "bar"
class Active extends Room
console.log Room.foo
按预期打印:bar
。
所以现在让我们尝试更接近原始示例:
class Room
@foo = Active
class Active extends Room
console.log Room.foo
这会打印undefined
,因为在定义Room.foo时未定义Active
。
最后,让我们来看看定义是否相反的情况:
class Active extends Room
class Room
@foo = Active
console.log Room.foo
这会引发错误,因为无法扩展undefined
。
最后两种情况表示更改原始示例中的require顺序。让基类的定义依赖于它的子类应该会导致你的OOP警报铃声响起! :)
可能有一种方法可以稍微更改定义以使其工作,但具有这些相互依赖性的代码往往难以维护。我建议找出一种完全解耦课程的方法。
答案 1 :(得分:0)
我无法确定这一点,但我可能遇到了类似的问题 - 这可能与 room / active.coffee 文件在之前的事实有关room / room.coffee 按字母顺序排列,因此当加载 active.coffee 文件时,首先会看到 Active
类 room。咖啡和 Room
还没有,所以无法找到超类。
我在编译时使用-j
运算符解决了这个问题,所以当你的 .coffee 文件很好并且有条理时,它们会编译成一个 .js file,它还有其他优点。
答案 2 :(得分:0)
@Active: require('./active')
删除此内容,或将其移至其他位置。你有一个循环依赖。在您定义room.coffee
时,您告诉它需要active.coffee
才能完成定义Room
,而active.coffee
需要Room
,所以{{1}如果需要Room
,则为undefined
。
你应该能够在最后添加active.coffee
,但后来我问你为什么甚至首先需要这个o.O