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
类中,而不是试图将它们保存在单独的文件中。查看我的更新。谢谢