我在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:case并从window.onload
函数的范围调用对象,例如它看起来像这样:
Snake.initialize(x, y);
while(some condition) {
Snake.move(x++, y);
}
and so on...
内存分配是否存在差异,是否存在一个性能问题?
答案 0 :(得分: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对象的全局实例。
创建对象的多个实例将需要更多资源,但在这种情况下,它可能不明显。如果您在游戏中只需要一条蛇,则使用方法一,如果您计划拥有多条蛇,则method2是正确的方法。在游戏中出现问题之前,我不会担心性能或资源使用情况。
答案 1 :(得分:0)
如果整个程序中只有一个Snake
(非常可能),那么第一种方法可能是最简单的解决方案。您可能不会注意到两者之间效率的差异。
如果你的程序中有多个Snake
(例如你正在制作多人游戏),那么第一种方法是不够的。第一种方法中的Snake
对象与OOP语言中的 singleton 进行比较,这意味着您在整个程序中只有一个。第二种方法是构造函数(与类进行比较),这意味着您可以构造具有不同属性的多个Snake
实例。
您仍然可以通过在position
上存储move
和Snake.prototype
方法来改进第二种方法,而不是在每个构造函数调用中创建新函数。效率可能并不重要,但是您将获得基于原型的继承,允许您创建继承自Snake
的其他构造函数( classes )。