我正在尝试稍微组织我的代码,但在未定义的父类(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
Active
的 super
被列为 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/