Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 类继承,并使用Coffeescript要求来自不同文件的子类_Javascript_Node.js_Inheritance_Coffeescript - Fatal编程技术网

Javascript 类继承,并使用Coffeescript要求来自不同文件的子类

Javascript 类继承,并使用Coffeescript要求来自不同文件的子类,javascript,node.js,inheritance,coffeescript,Javascript,Node.js,Inheritance,Coffeescript,我试图稍微组织一下我的代码,但是对于未定义的超类有问题。我希望这只是一个加载路径问题,但我想不出来。我正在与以下人员一起运行此程序: coffee rooms.coffee 房间。咖啡 Room = require('./rooms/room') module.exports = class Rooms extends Object constructor: -> @ module.exports = class Room @Active: requi

我试图稍微组织一下我的代码,但是对于未定义的超类有问题。我希望这只是一个加载路径问题,但我想不出来。我正在与以下人员一起运行此程序:

coffee rooms.coffee
房间。咖啡

Room = require('./rooms/room')

module.exports = class Rooms extends Object
    constructor: ->
        @
module.exports = class Room
    @Active: require('./active')

    constructor: (@id) ->
        @users = {}
Room = require('./room')

console.log Room #=> {}

module.exports = class Active extends Room
    constructor: (@id) ->
        @type = "Active"
        super
房间/房间。咖啡

Room = require('./rooms/room')

module.exports = class Rooms extends Object
    constructor: ->
        @
module.exports = class Room
    @Active: require('./active')

    constructor: (@id) ->
        @users = {}
Room = require('./room')

console.log Room #=> {}

module.exports = class Active extends Room
    constructor: (@id) ->
        @type = "Active"
        super
客房/活动。咖啡

Room = require('./rooms/room')

module.exports = class Rooms extends Object
    constructor: ->
        @
module.exports = class Room
    @Active: require('./active')

    constructor: (@id) ->
        @users = {}
Room = require('./room')

console.log Room #=> {}

module.exports = class Active extends Room
    constructor: (@id) ->
        @type = "Active"
        super
如果我尝试执行
新活动
,则会出现以下错误:

TypeError: Cannot read property 'constructor' of undefined
活动的
超级
列为
未定义的

[Function: Active] __super__: undefined
为什么
房间
未定义?(或者更确切地说,只是一个空对象?)

更新

Room = require('./rooms/room')

module.exports = class Rooms extends Object
    constructor: ->
        @
module.exports = class Room
    @Active: require('./active')

    constructor: (@id) ->
        @users = {}
Room = require('./room')

console.log Room #=> {}

module.exports = class Active extends Room
    constructor: (@id) ->
        @type = "Active"
        super
正如下面许多人指出的那样,这是由循环依赖引起的。我最终只是将子类定义放在基类定义的内部,而不是将它们保存在单独的文件中。大概是这样的:

class Room
  constructor: ->
    # ...

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

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

active   = new Room.Active
inactive = new Room.Inactive
class Room
  @foo = "bar"

class Active extends Room

console.log Room.foo

我不能确定这一点,但我可能也遇到了类似的问题-这可能是因为文件室/active.coffee按字母顺序排在room/room.coffee之前,因此当加载active.coffee文件时,首先会查看
active
类,room.coffee和
room
还没有,因此无法找到超类


我在编译时使用了
-j
操作符来解决这个问题,因此,尽管你的.coffee文件很好而且组织有序,但它们编译成一个.js文件,这也有其他优点。

这是一个将代码简化为最原始部分(同时仍然看到错误)的例子。如果我们删除requires并去掉大部分代码,我们可以得到如下结构:

class Room
  constructor: ->
    # ...

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

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

active   = new Room.Active
inactive = new Room.Inactive
class Room
  @foo = "bar"

class Active extends Room

console.log Room.foo
它按预期打印:

现在让我们试着更接近原始示例:

class Room
  @foo = Active

class Active extends Room

console.log Room.foo
这将打印未定义的
,因为定义Room.foo时未定义
活动的

最后,让我们看看定义颠倒的情况:

class Active extends Room

class Room
  @foo = Active

console.log Room.foo
这会引发错误,因为无法扩展
未定义的

最后两个案例表示更改原始示例中的require顺序。让基类的定义依赖于它的子类应该会导致OOP警报开始响起!:)

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

@Active:require('./Active')
将其删除,或移动到其他地方。你有一个循环依赖。当您定义
room.coffee
时,您告诉它在完成定义
room
active之前需要
active.coffee
。coffee
需要
room
,因此当
active.coffee
时,
room
将是
未定义的


你应该可以在最后添加一个
Room::Active=require('./Active')
,但是我问你为什么在第一个地方需要这个o.o

,但是
#=>
做什么呢?这只是一个注释,我正在显示该命令的输出(它输出的只是一个空对象),我看到了。我想我错过了一些新奇的语法。你是对的,这是一个循环依赖问题。最后,我只是将子类定义放在
Room
类中,而不是试图将它们保存在单独的文件中。查看我的更新。谢谢