2011-11-19 59 views
0

下面是我的代碼。我希望Player1,2將成爲原始RPSPlayer的對象,並且每個人都有獨立的「歷史」數組。但現在,每次我運行Player1.play()和Player2.play()時,他們都會更新同一個「歷史」數組並共享它。謝謝!面向對象的Java腳本

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

你必須在構造函數初始化實例屬性:

function RPSPlayer() { 
    this.history = []; 
} 

分配到RPSPlayer.prototype屬性的每個值的所有實例(這是原型的目的之一)之間共享。

+0

怎麼可能是PLAYER1和Player2有不同的 'numOfWins'? (在我第一次執行) – Sanich

2

構造函數原型上的任何東西都與所有實例化共享。對於功能來說,這太棒了。對多個對象使用相同的函數是非常有效的。但是對於數據來說不太好,因爲對象不再有每一個的新副本。

這特別令人困惑,因爲原型是放置「實例」方法的地方,對吧?但是要意識到所有實例化都共享相同的函數對象,並且函數只是用不同的「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/

+0

謝謝!但是,Player1和Player2有什麼不同的'numOfWins'? (在我的第一個實現中) – Sanich

+0

如果你執行'instance.property = value',你在實例上設置屬性,對原型值進行寫操作。不管之前有什麼,這隻會在這種情況下設置一個屬性。這是因爲當一個對象本身沒有屬性時,它會查找原型來查看是否有一個屬性。在實例對象上分配一個屬性集,它永遠不會爬到原型。 –

+0

哦,最後不要修改構造函數本身的原型。既可以在構造函數外部創建原型方法,也可以在構造函數中使用'this.foo = function(){}'。 –