我刚刚开始摆弄JavaScript。来自Java和OO PHP的每一步都变得怪异了:)
这是我对javascript的介绍项目,其中我已经开始编程Catan的Settlers的多人游戏版本。下面的代码尝试将N个大小的六边形地图图块的立方体坐标存储在一个数组中。
我读过您通过将函数分配给变量来在javascript中声明对象。
var Tile = function (x, y, z) {
this.x = x;
this.y = y;
this.z = z;
};
var Map = function () {
var grid = [];
function generate_map(radius) {
for (width = -radius; width <= radius; width++) {
var r1 = Math.max(-radius, -width - radius);
var r2 = Math.min(radius, -width + radius);
for (r = r1; r <= r2; r++) {
grid.push(new Tile(width, r, -width - r));
}
}
}
};
我尝试实例化新的Map对象,调用其唯一的函数,并输出存储在grid []数组中的结果值。但是对于每个循环来说,效果并不好:(我得到了意外的标识符。
var main = function () {
var basic_map = new Map();
basic_map.generate_map(3);
for each (var tile in basic_map.grid) {
console.log(tile.x, tile.y, tile.z);
}
};
main();
我完全知道这是面临的错误之一,但请多多关怀,加油!
更改此:
function generate_map(radius) {
...对此:
this.generate_map = function(radius) {
编辑:实际上有比我最初意识到的更多的问题.... :)
其他一些技巧:
首先,我建议更改:
var Tile = function (x, y, z) {
...简单来说就是:
function Tile(x, y, z) {
(地图也是如此)。您当前的解决方案可以正常工作,但不是很惯用,并且在ES6中,规范中没有任何var Tile = function
导致结果函数的'name'属性设置为“ Tile”的属性,这在调试时很有用。我最近写了另一个答案,进一步探讨了例如function Foo() {}
和之间的差异var Foo = function() {}
。
其次,您可能想重命名Map
为其他名称。Map
现在是ES6的核心部分(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map)。
第三,即使您可以使用创建generate_map
函数this.generate_map
,您也可能希望将其移至Map's
原型。另外,由于需要公开该grid
值,因此您希望将其存储为属性,而不是作用域为NewMapName
构造函数的局部变量。例如,:
function NewMapName() {
this.grid = [];
}
NewMapName.prototype.generateMap = function(radius) {
// you can access the grid here via `this.grid`
...
};
通过将其移至原型,这意味着的所有实例NewMapName
将共享相同的功能引用,而不是一遍又一遍地创建(尽管也许您实际上只创建了一次?无论哪种方式,它都比较惯用,最低限度)。请注意,我在这里使用了“ camelCasing”(见最后一点)。
第四,您的generateMap
实现泄漏了一些全局变量(width
和r
,因为您没有使用声明它们var
)。我将其更改为:
NewMapName.prototype.generateMap = function(radius) {
for (var width = -radius; width <= radius; width++) {
var r1 = Math.max(-radius, -width - radius);
var r2 = Math.min(radius, -width + radius);
for (var r = r1; r <= r2; r++) {
grid.push(new Tile(width, r, -width - r));
}
}
};
第五,您的循环有点中断。我将其重构如下:
var main = function () {
var basicMap = new NewMapName();
basicMap.generateMap(3);
basicMap.grid.forEach(function(tile) {
console.log(tile.x, tile.y, tile.z);
});
};
main();
最后,可能也是最次要的是,在JavaScript领域,camelCase
它要占主导地位snake_case
,因此generate_map
可能会“更好” generateMap
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句