下面是我的代码。我希望Player1,2将成为原型RPSPlayer的对象,并且每个都将具有单独的“历史”数组。但是现在,不管怎样,每当我运行Player1.play()和Player2.play()时,它们都会更新相同的“历史”数组并共享它。谢谢!
function RPSPlayer() {}
RPSPlayer.prototype.numOfWins = 0;
RPSPlayer.prototype.history = [];
RPSPlayer.prototype.myCurrPick;
RPSPlayer.prototype.getW = function () {return this.numOfWins;};
RPSPlayer.prototype.choose = function (item) {
this.history.push(item);
};
Player1 = new RPSPlayer();
Player1.play = function(){
var randomnumber=Math.floor(Math.random()*3);
if(randomnumber==0){this.currPick = "rock";}
else if(randomnumber==1){this.currPick = "paper";}
else{this.currPick = "scissors";}
this.choose(this.currPick);
return this.currPick;
};
Player2 = new RPSPlayer();
Player2.play = function(){
this.choose("rock");
this.currPick = "rock";
return "rock";
};
答案 0 :(得分:2)
您必须在构造函数中初始化实例属性:
function RPSPlayer() {
this.history = [];
}
分配给RPSPlayer.prototype
属性的每个值都在所有实例之间共享(这是原型的目的之一)。
答案 1 :(得分:2)
构造函数原型上的任何内容都与ALL实例共享。对于功能,这很棒。对多个对象使用相同的函数非常有效。但是对于数据来说不那么令人敬畏,因为对象不再拥有每个数据的新副本。
这特别令人困惑,因为原型是您放置“实例”方法的地方,对吧?但只是意识到所有实例化都共享相同的函数对象,而函数只是用不同的“this”调用。
通过在构造函数中初始化实例级属性来解决此问题。
var Foo = function() {
this.someProperty = someValue;
};
检查此代码段,这表明存在差异。
var Foo = function() {
this.instanceArray = [];
};
Foo.prototype.sharedArray = [];
var a = new Foo();
a.bar = function() {
this.instanceArray.push('a');
this.sharedArray.push('a');
};
a.bar();
var b = new Foo();
b.bar = function() {
console.log(this.instanceArray[0]); // undefined
console.log(this.sharedArray[0]); // "a"
};
b.bar();