面向对象的java脚本

时间:2011-11-19 00:50:26

标签: javascript oop

下面是我的代码。我希望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";
};

2 个答案:

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

http://jsfiddle.net/nf3Jm/3/