【问题标题】:Creating and naming 'n' JQuery objects in a for-loop (OOP)在 for 循环 (OOP) 中创建和命名“n”个 JQuery 对象
【发布时间】:2017-08-13 19:43:09
【问题描述】:

我正在尝试制作一个非常非常简单的台球游戏来练习 JQuery OOP。我开始了;我有这个代码:

//Main ball "class"
function createBall(number, color){
  this.number = number;
  this.color = color;
}
$color = ["noColor", "yellow","blue","red","purple","orange","green"...];
$ball1 = new createBall(1, $color[1]);
$ball2 = new...

但是,我不想逐个球创建一个对象,所以我尝试使用for;像这样工作的东西:

for(var $i = 1; $i <= 15; $i++){
  ball+$i = new createBall($i, $color[i]);
}

显然,我无法使用“ball+$i”命名新对象。我正在尝试实现这一目标,因为我想稍后使用“ball1.color = 'red'...”并更改对象属性等。 现在的工作方式是这段代码:

$ballArray[] = new Array;
for(var $i = 1; $i <= 15; $i++){
  $ballArray[$i] = new createBall($i, $color[i]);
}

如果我调用$ballArray[1].color,它应该返回"yellow";但我不确定“$ballArray[1]”是否实际上是对象名称,或者每次我“调用”这个对象属性并生成一个新属性时,它是否会调用createBall() 函数。这可能会创建大量的对象,那是不行的。我做对了吗?还是有其他方法可以正确地做到这一点?

最后,我只是想创建并命名所有的球对象,而不是一个一个地做,以防我以后需要创建100个对象。

希望我的解释正确。 欢迎提出所有建议 :)

【问题讨论】:

  • new 在您的代码中为每个数组对象调用一次。 new 返回一个createBall 的实例,该实例存储在数组中。当您想要存储许多相同类型的项目时,数组通常是正确的选择。顺便说一句,要遵循 OOP,您的类可能应该称为 Ball,而不是 createBall。创建发生在new,对象是Ball
  • 嗯,你在正确的轨道上,但你的 for 循环从 1 开始,数组从 0 开始索引。我会说for (var $i = 0; $i &lt; 15; $i++),然后说$ballArray[$i] = new createBall($i + 1, $color[$i]);。至于你关于它是对象名称的问题,我不确定你在问什么,但我可以说,任何时候你使用 new 关键字,它都会返回一个对象。所以在这种情况下,$ballArray 的每个元素实际上都是一个球对象,具有在创建时指定的属性。
  • 另外,@JeffB 提到类名的 +1 应该是 Ball 而不是 createBallcreateBall 可以是返回new Ball(number, color) 的函数,但类本身应该被称为Ball。我用完了字符来提及 xD
  • 您还可以将[] 作为$ballArray 的变量名的一部分,在Javascript 中您只需说$ballArray = new Array,或者$ballArray = []; 旁注——这些都不是jQuery代码,这都是纯 JavaScript
  • 非常感谢!我制作了一个快速数组,这就是它以 1 开头的原因。关于 JQuery 的事情,写了因为我稍后在代码中使用 $(...).stuff ,但你是对的。我会继续尝试制作这个程序,并清除我的代码。也许我不需要像我想的那样为每个对象命名(就像@Rory-McCrossan 在答案中所说的那样);只是数组。

标签: jquery loops oop object


【解决方案1】:

我不确定$ballArray[1] 是否实际上是对象名称,或者每次我“调用”此对象属性并生成一个新属性时它是否调用 createBall() 函数。

$ballArray 变量包含一个数组,其中包含createBall() 构造函数返回的值。因此,您的代码很好,因为每次循环迭代只创建一个对象实例。

不过,我建议您进行一些修改以提高您的代码质量。

  • $ 用作保存 jQuery 对象的变量的前缀,因此在您的示例中不适用,因为您根本不使用任何 jQuery 逻辑
  • 调用类Ball,因为它描述了对象是什么。 createBall 更像是一个方法名称,因为它是一个动词,描述了逻辑的作用。
  • 数组名后面不需要跟[]
  • 使用push() 将新项目添加到数组的最后一个位置。
  • 数组索引从0 开始,所以大概你的for 循环也应该如此

function Ball(number, color) {
  this.number = number;
  this.color = color;
}

var ballArray = [];
var colors = ["noColor", "yellow", "blue", "red", "purple", "orange", "green"];

for (var i = 0; i <= 15; i++) {
  ballArray.push(new Ball(i, colors[i % colors.length]));
}

console.log(ballArray);

【讨论】:

  • 感谢所有建议!不知道不必为每个对象命名 - 只是一个存储它的地方。我会处理这个。最后,我应该将问题标题更改为规则吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
相关资源
最近更新 更多