Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中许多构造函数参数的替代方案_Javascript - Fatal编程技术网

javascript中许多构造函数参数的替代方案

javascript中许多构造函数参数的替代方案,javascript,Javascript,基本上,我试图找出如何避免javascript中的构造函数中有大量参数。原因是我正在和一个朋友玩一个基于太空的游戏,飞船是基于模块的。目前,他们可以拥有一个引擎和许多传感器、武器和殖民地模块。可能还会有更多。每艘飞船都是根据一个规范建造的,所以要建造一艘飞船,你只需要给它一个规范,其余的由飞船的建造师来处理。但在制定规范时,我需要提供模块。我想避免的是这样做: ShipSpec = function(civ, name, hull, engine, sensors, weapons, colon

基本上,我试图找出如何避免javascript中的构造函数中有大量参数。原因是我正在和一个朋友玩一个基于太空的游戏,飞船是基于模块的。目前,他们可以拥有一个引擎和许多传感器、武器和殖民地模块。可能还会有更多。每艘飞船都是根据一个规范建造的,所以要建造一艘飞船,你只需要给它一个规范,其余的由飞船的建造师来处理。但在制定规范时,我需要提供模块。我想避免的是这样做:

ShipSpec = function(civ, name, hull, engine, sensors, weapons, colony, ...) {}
我不确定最好的解决方案是什么。目前我有一个访问者模式解决方案,其中每个模块都有一个“register”方法。此方法有一个参数,然后使用该参数注册自身(如果模块是武器,则调用注册武器的方法;如果模块是传感器,则调用注册传感器的方法等)。那么我可以做:

ShipSpec = function(civ, name, hull, engine, modules) {}
不过,我觉得可能有点复杂。大概我有一种不幸的能力,有时会把事情复杂化一点。创建一个等级库,然后在创建之后将模块添加到等级库中,这样会更好吗?或者这个解决方案可以吗?这个问题还有别的解决办法吗

我们计划让玩家可以创建规格,也许可以修改现有的规格,所以我想用一种好的方式让它变得容易

保重,,
Kerr

考虑使用spec对象作为构造函数参数:

var spec = {
  civ: "...",
  name: "...",
  hull: "...",
  ...
};
ShipSpec = function(spec) {}
这样:

  • 构造函数参数是命名的,因此更容易掌握
  • 论点可以按任何顺序给出
  • 你可以提出一些论点

由于缺少更好的语法,这是我们在javascript中能得到的最好的语法。谢谢你的想法。不过,这是一个问题。我应该把构造器中的每个参数都放在这样的对象中,还是只放在可选的对象中?@Kerr-基本上由你决定。就我个人而言,我会根据强制性论点的数量来做出决定。如果它很小(如2、3或4),我可以将它们作为单独的参数。如果有多个强制参数,我认为将它们移动到spec对象更有意义,因为代码可读性更强。Ok。不会有那么多的强制参数,只有civ、name、hull和engine(毕竟,所有船舶都需要一个engine:p),所以我想我可以将它们作为单独的参数保存。谢谢:D。