Javascript对象交互(OOP)

时间:2012-01-18 10:16:46

标签: javascript oop

很难获得您正在搜索的OOP的确切具体信息。 我尽量保持尽可能短的时间:

我目前正在开发HTML5中的跳转运行。 我实际上没有开发游戏的真实经验。 但我知道基础知识应该如何运作。 我只是想知道我做得对。

我有一个游戏,玩家和关卡对象。

我目前正在做的是以下内容:

Game.player = new Player();
Game.level = new Level();

Game.level.load(Game.currentLevel);
...
Game.run();

这是最好的方式还是我应该自己调用它们,例如:

var Player = new Player();
var Level = new Level();
Level.load(Game.currentLevel);
...
Game.run();

我现在这样做(第一个)对我来说似乎更合乎逻辑。 但是..在水平对象函数中,我必须检查游戏对象中的各种变量或调用其自身的函数。因此,我必须在Level对象函数内编写Game.level.funcName。但由于Game.level实际上并不存在于关卡对象声明点,因此感觉有点不对劲和肮脏。这是另一个例子:

Level.prototype.reset = function() {
    this.load(Game.currentLevel);
};

Game.currentLevel是硬编码的,是不是有更好的方法可以检测当前处理游戏对象的变量,还是我完全按照我的方式进行操作?

所以基本的问题是,让对象互相交流的最佳方法是什么?

最后一个问题有点偏离主题,但是()();做? 我有时会看到它像这样使用:

(function() {
    // Content
});

我希望您了解我的疑虑,感谢您的时间和答案。 :)

4 个答案:

答案 0 :(得分:1)

我会推荐第一种方法,因为它更模块化 只需将Game实例的引用传递给其他组件即可解决您的问题,以便他们了解游戏。
对象在javascript中具有循环结构并不罕见:

Game.level = new Level();
Game.level._game = Game;
//...
Level.prototype.reset = function() {
    this.load(this._game.currentLevel);
};

当然,你可以通过在初始化时传递引用来做得更优雅,但我认为你明白我的观点。

答案 1 :(得分:0)

我已回答上一个问题

问题:()();做?我有时会看到它像这样使用:

(function() {
    // Content
});

自动执行闭包。我将在这里提供最简单的解释。当我们编写java脚本函数时,需要调用它们来执行它们。

例如,

function alertMe(){
 alert('alerted');
}

alertMe(); // We need to call intentionally for execution of function.

自动执行闭包不需要单独调用。

例如,

(function(){
 alert('alerted');
})();

上面的javascript会在加载脚本时自动执行。 SO here已回答相同问题。

答案 2 :(得分:0)

我认为你做事的方式看起来很不错。关于问题的最后一部分,这称为立即函数。它是一个在声明后立即调用的函数。您可以在此处查看更多信息:http://javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/

答案 3 :(得分:0)

从用户互动开始,向后工作。如果设计过于灵活或解决了太多问题,可能会过多地参与设计过程并提出复杂的设计。

基于我对游戏的有限知识,甚至游戏编程的较少,以及您向我们展示的内容,我相信您在这里有两个用户互动。

  1. 用户选择要玩的特定游戏级别
  2. 用户重置该游戏级别
  3. 将当前级别存储为游戏对象的属性非常好。我可以想到处理这些交互所需的两种方法,这两种方法对Game对象都有意义。

    function setLevel(levelNumber) {
       this.currentLevelNumber = levelNumber;
       this.level = new Level(levelNumber);
    }
    
    function resetCurrentLevel() {
       this.setLevel(this.currentLevelNumber);
    }
    

    我会断开从Level对象到Game对象的连接,并尽可能独立于游戏加载一个级别。所以不要这样做,

    game.level = new Level();
    game.level.load(game.currentLevel);
    

    我要在Level构造函数本身上初始化一个级别的负担,如,

    game.level = new Level(8);
    

    甚至更好,让它成为Game对象的方法调用,如上例所示 - setLevel(n)。该方法将负责确保当级别改变时游戏对象是一致的。

    game.setLevel(8);
    

    由于重置函数resetCurrentLevel在内部使用此方法,因此无论是加载新级别还是重置当前级别,都将统一级别更改的处理。