我有一个初始化玩家对象的Game类。我正在初始化两个玩家p1
和p2
。然而,当我控制台登录时,即使我将p2
的颜色设置为#000
,它们也会返回相同的设置。
有什么问题?
我已尝试this.p1.color
和this.p1['color']
var Game = {
players: 2,
p1: {},
p2: {},
currentPlayer: 1,
initPlayers: function(){
this.p1 = Player;
this.p2 = Player;
this.p1.credits = 500;
this.p2.credits = 800;
this.p1['color'] = '#3e3e3e';
this.p2['color'] = '#000';
console.log(this.p1);
console.log(this.p2);
}
}
var g = Game;
g.initPlayers();
Console.log
正在显示
Object {credits: 800, moves: Array[0], color:'#000', getMoves: function, checkPlayer: function, enterMove: function…}
Object {credits: 800, moves: Array[0], color:'#000', getMoves: function, checkPlayer: function, enterMove: function…}
即使我在上面单独设置它们。
显然,值的设置是有效的,包括括号和点表示法,但是,它好像只有最终值才能成功。并复制到p1
和p2
。
我错过了一些非常明显的东西吗?
答案 0 :(得分:2)
设置
时this.p1 = Player;
this.p2 = Player;
您使两个变量都保持相同的对象。我不确定你想要什么,所以这里有两个假设:
1)如果你想拥有Player
对象的单独副本,你应该克隆它们,例如像这样(对于非深度克隆):
this.p1 = {};
this.p2 = {};
for (var k in Player) {
this.p1[k] = Player[k];
this.p2[k] = Player[k];
}
2)如果Player
是一个类,如大写名称所示,那么您需要的是一个实例,使用new
完成:
this.p1 = new Player();
this.p2 = new Player();
答案 1 :(得分:1)
在JavaScript中为对象分配内容时(例如this.p1 = Player
),您不会创建新对象,而只会链接到现有对象。您需要使用Player
作为原型创建一个新对象:
this.p1 = Object.create(Player);
this.p2 = Object.create(Player);
同样,当你创建新游戏时,如果你想拥有多个游戏,最好使用Object.create()
:
var g = Object.create(Game);