我正在尝试稍微组织我的代码,但在未定义的父类(super class)方面存在问题。我希望这只是一个加载路径问题,但我无法弄清楚。我正在运行它:

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
Activesuper 被列为 undefined :
[Function: Active] __super__: undefined

为什么 Room 未定义? (或者更确切地说,只是一个空对象?)

更新

正如下面许多人指出的那样,这是由循环依赖引起的。我最终只是将子类定义放在基类定义中,而不是尝试将它们保存在单独的文件中。像这样的东西:
class Room
  constructor: ->
    # ...

  class @Active extends Room
    constructor: ->
      # ...

  class @Inactive extends Room
    constructor: ->
      # ...

active   = new Room.Active
inactive = new Room.Inactive

最佳答案

在这种情况下,将代码简化为最原始的部分(同时仍然会看到错误)是很有启发性的。如果我们去掉requires并去掉大部分代码,我们可以得到这样的结构:

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 警钟开始响起! :)

可能有一种方法可以稍微更改定义以使其工作,但是具有这些相互依赖关系的代码往往是无法维护的。我建议找出一种方法来完全解耦这些类。

关于javascript - 类继承,并使用 Coffeescript 要求来自不同文件的子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12524078/

10-13 00:17