【问题标题】:RequireJS and Class InheritanceRequireJS 和类继承
【发布时间】:2014-05-30 22:51:09
【问题描述】:

我正在尝试使用 RequireJS 模块在 Javascript 中实现经典继承,以使用 HTML5 构建游戏引擎。我试过使用 John Resig 的Class.js,但它似乎不像我预期的那样工作。这是我的项目Github rep,如果您下载文件并在客户端文件夹中打开 index.html,该应用程序可以在没有服务器的情况下运行。

在应用程序中,我创建了一个名为 Entity 的基类。实体是游戏中所有对象的基类,并由许多其他类扩展。 sprite 类扩展了实体类并包含动画方法。播放器类扩展了精灵类。

当我创建一个名为 Image 的类来扩展 Entity 类时,问题出现了。 Player 和 Image 类都扩展了实体(玩家去 entity->sprite->player),但是当 Player 设置速度时,它也会影响图像的实例?我添加了一个 console.log,它在 Image 的 think 函数(游戏循环刻度)中打印对象速度。如果您按箭头键让玩家四处走动,您将看到玩家的速度来自图像思考打印。

它们不应该是具有单独属性的独立对象吗?这就是我想要的。关于我做错了什么或完成正确继承的链接/模式的任何想法?

【问题讨论】:

    标签: javascript class inheritance requirejs


    【解决方案1】:

    Entity#velocity 应该在构造函数中初始化,而不是在“类定义”中(尽管在 JavaScript 中没有这样的东西,即使使用辅助库,例如 John Resig 的 Class.js)。

    所有 JavaScript 变量和属性都只是指向内存中不同位置的指针。您的代码只是更改了velocity 属性的x 属性,而没有实际更改velocity 的引用,因此属性x 的更改会反映在其他对象中。

    所以而不是:

    var Entity = Class.extend({
      velocity: { x: 0, y: 0 },
      init: function () { }
    });
    

    你会这样做:

    var Entity = Class.extend({
      init: function () {
        this.velocity = { x: 0, y: 0 };
      }
    });
    

    【讨论】:

    • 非常感谢!可惜换个方向看起来干净多了。
    • 您可以修改 Class.js 以便 new 调用执行深层复制。但它不适用于使用特定类的构造函数初始化的成员变量。在这种情况下,它变得非常复杂。但如果有什么安慰的话,Python does not support defining member variables in class definitions。所以你,JavaScript 程序员,在这种情况下不应该感到孤单;)。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2023-03-10
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    相关资源
    最近更新 更多