对象JavaScript中对象之间的交叉通信

时间:2017-05-01 18:06:17

标签: javascript closures

请原谅我,如果之前已经回答,但我的搜索没有结果。这可能是因为我缺乏所需的术语。

我一直在研究基于文本的RPG作为辅助项目,并且一直在closures中尝试JavaScript。以下是我想要完成的一个非常基本的例子:

app.js

var app = {};

这是安装所有内容以保留namespace

的地方

character.js

app.character = (function() {
  // the character manipulation object
  // this will be used to create character objects
  function _createCharacter(name) {
    return {
      // Just an example
      name: name,
      stats: { health: 10, level: 1 },
      weapon: {}
    };
  }
  return {
    createCharacter: _createCharacter
  };
})();

角色对象非常简单,但下一部分是什么变得棘手。

items.js

app.items = {};

items对象将保存其他对象;每个项目类型一个,因为它们的行为都不同。类型将是:gearconsumablequest。为简单起见,我只提供了装备。

gear.js

app.items.gear = (function() {
  // the gear manipulation object
  // this will be used to create gear objects
  function _createGear() {
    return {
      name: 'Sword',
      mods: { damage: 3, strength: 1 } // In reality it's random
    };
  }
  return {
    createGear: _createGear
  };
})();

所以这个对象是app对象深处的两个对象。

game.js

app.game = (function() {
    var _player = {};
    // closed functions in this area
    function _giveWeapon() {
      _player.weapon = this.item.gear.createGear();
    }
    function _newPlayer(name) {
      _player = this.character.createCharacter(name);
      _giveWeapon();
    }
    function getPlayer() {
      return _player;
    }
    return {
      getPlayer: _getPlayer,
      newPlayer: _newPlayer
    };
})();

这是引导游戏的对象,即根据需要调用其他对象以获取功能。

int.js

app.game.newPlayer('Ryan');
// should create { name: 'Ryan', stats: { health: 10, level: 1 }, weapon {} under game._player

这只是开始游戏。

在运行时,它会在任何事情发生之前创建错误,因为game对象无法看到items.gearcharacter个对象并将其作为undefined返回。我想要的是让他们都能够在app对象内部相互通信,同时保持闭包。此外,有关构建单一命名空间复杂JavaScript应用程序的任何建议都非常有用。

2 个答案:

答案 0 :(得分:1)

所以我修改了一些功能点和一些美学点。

<强>功能
  - 将app对象传递到game闭包中,然后使用它代替this
  - 更改theApp.item.gear - &gt; theApp.items.gear

<强>审美
  - 使用功能提升创建更多可浏览代码。用必要的变量初始化你的闭包,然后返回你的api。之后,如果需要详细信息,您可以声明只需要引用的函数。

我对命名空间原则无能为力,因为我避免使用它们来支持捆绑包和“require”或更近期的“import”语句。

var app = {};

app.character = (function() {
  return {
    createCharacter: _createCharacter
  };

  // the character manipulation object
  // this will be used to create character objects
  function _createCharacter(name) {
    return {
      // Just an example
      name: name,
      stats: { health: 10, level: 1 },
      weapon: {}
    };
  }
})();

app.items = {};

app.items.gear = (function() {
  return {
    createGear: _createGear
  };

  // the gear manipulation object
  // this will be used to create gear objects
  function _createGear() {
    return {
      name: 'Sword',
      mods: { damage: 3, strength: 1 } // In reality it's random
    };
  }
})();

app.game = (function(theApp) {
  var _player = {};

  return {
    getPlayer: _getPlayer,
    createPlayer: _createPlayer
  };

  // closed functions in this area
  function _giveWeapon() {
    _player.weapon = theApp.items.gear.createGear();
  }
  function _createPlayer(name) {
    _player = theApp.character.createCharacter(name);
    _giveWeapon();
  }
  function _getPlayer() {
    return _player;
  }
})(app);

// should create { name: 'Ryan', stats: { health: 10, level: 1 }, weapon {} under game._player
app.game.createPlayer('Ryan');
var ryan = JSON.stringify(app.game.getPlayer(), null, 2);
document.getElementById('ryan').innerHTML = ryan;
<pre id="ryan"></pre>

答案 1 :(得分:1)

下面的代码可以帮到你:

基本上,你的代码之前没有工作的原因是,当你点击这一行this.character.createCharacter(name);时,对this的绑定是游戏,但游戏对象不包含{{1对象。 类似的逻辑应用于chatacter行。

&#13;
&#13;
this.item.gear.createGear();
&#13;
&#13;
&#13;