请原谅我,如果之前已经回答,但我的搜索没有结果。这可能是因为我缺乏所需的术语。
我一直在研究基于文本的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对象将保存其他对象;每个项目类型一个,因为它们的行为都不同。类型将是:gear
,consumable
,quest
。为简单起见,我只提供了装备。
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.gear
或character
个对象并将其作为undefined
返回。我想要的是让他们都能够在app
对象内部相互通信,同时保持闭包。此外,有关构建单一命名空间复杂JavaScript应用程序的任何建议都非常有用。
答案 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
行。
this.item.gear.createGear();
&#13;