为什么此对象返回相同的设置?

时间:2013-12-26 11:27:32

标签: javascript object

我有一个初始化玩家对象的Game类。我正在初始化两个玩家p1p2。然而,当我控制台登录时,即使我将p2的颜色设置为#000,它们也会返回相同的设置。

有什么问题?

我已尝试this.p1.colorthis.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…}

即使我在上面单独设置它们。

显然,值的设置是有效的,包括括号和点表示法,但是,它好像只有最终值才能成功。并复制到p1p2

我错过了一些非常明显的东西吗?

2 个答案:

答案 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);