5

我在 javascript 中制作了一个蛇游戏,并在 window.onload 函数中创建了对象和游戏循环。

window.onload = function() { ... Code ... };

现在我想知道我在函数范围内创建的对象是否被有效使用?使用这两种声明有什么区别?

1:

var Snake = { 
    x: null,
    y: null,
    initialize: function(x, y) { this.x = x; this.y = y },
    position: [x, y], 
    move: function(x, y) { ... Code ... }
}

2:

function Snake(x, y) {
    this.x = x;
    this.y = y;
    this.position = function() { return [this.x, this.y]; };
    this.move = function(x, y) { ... Code ... };
}

我目前使用 1: 案例并从window.onload函数范围调用对象,例如它看起来像这样:

Snake.initialize(x, y);
while(some condition) {
    Snake.move(x++, y);
}
and so on...

内存分配是否存在差异,是否存在一些性能问题?

4

2 回答 2

3

第一种方法仅使用对象字面量表示法创建一个对象,而第二种方法使用构造函数方法,该方法可以创建对象的多个实例。

例如方法 2 允许:

var snake1 = new Snake(1,2);
var snake2 = new Snake(2,2);
//now I have two snakes, however method 1 would only ever have one copy of snake.

使用方法 1 将为整个游戏提供一个 Snake 对象的全局实例。

创建一个对象的多个实例将需要更多资源,但是在这种情况下它可能并不明显。如果您的游戏中只需要一条蛇,请使用方法一,如果您打算拥有多条蛇,则方法二是正确的方法。我不会担心性能或资源使用,直到它成为您游戏中的问题。

关于构造函数的文章

于 2013-06-11T08:59:57.580 回答
0

如果整个程序中只有一个Snake(很可能),那么第一种方法可能是最简单的解决方案。您可能不会注意到两者之间的效率差异。

如果您的程序中有多个Snakes(例如,您正在制作多人游戏),那么第一种方法是不够的。第Snake一种方法中的对象与 OOP 语言中的单例相比,这意味着您的整个程序中只有一个。第二种方法是构造函数(与class相比),这意味着您可以构造Snake具有不同属性的多个实例。

您仍然可以通过存储positionandmove方法来改进第二种方法,Snake.prototype而不是在每个构造函数调用中创建新函数。这对效率来说可能并不重要,但是您将获得基于原型的精美继承,允许您使其他构造函数()继承自Snake.

于 2013-06-11T09:04:47.120 回答