类继承,并要求使用Coffeescript从不同文件中创建子类

时间:2012-09-21 04:03:37

标签: javascript node.js inheritance coffeescript

我正在尝试组织我的代码,但是有未定义的超类问题。我希望这只是一个负载路径问题,但我无法弄明白。我正在运行:

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

3 个答案:

答案 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