gpt4 book ai didi

javascript - 类继承,并使用 Coffeescript 需要来自不同文件的子类

转载 作者:搜寻专家 更新时间:2023-10-31 23:55:52 26 4
gpt4 key购买 nike

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

coffee rooms.coffee

房间.咖啡

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

module.exports = class Rooms extends Object
constructor: ->
@

rooms/room.coffee

module.exports = class Room
@Active: require('./active')

constructor: (@id) ->
@users = {}

rooms/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

最佳答案

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

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

最后两种情况代表更改原始示例中的要求顺序。让基类的定义依赖于它的子类应该让你的 OOP 警钟开始响起! :)

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com