объект ориентирован с помощью скрипта Java - PullRequest
0 голосов
/ 19 ноября 2011

ниже мой код. Я хочу, чтобы Player1,2 был объектами прототипа RPSPlayer и чтобы у каждого был отдельный массив 'history'. Но теперь, так или иначе, каждый раз, когда я запускаю Player1.play () и Player2.play (), они оба обновляют один и тот же массив 'history' и делятся им. Спасибо!

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 ]

2 голосов
/ 19 ноября 2011

Все в прототипе конструктора используется совместно со ВСЕМИ экземплярами.Для функций это круто.Очень эффективно использовать одни и те же функции для нескольких объектов.Но для данных это менее круто, потому что у объектов больше нет свежей копии для каждого.

Это особенно запутанно, потому что в прототипе вы помещаете методы «экземпляра», верно?Но просто поймите, что все экземпляры имеют одни и те же функциональные объекты, и функции просто вызываются с другим «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/

2 голосов
/ 19 ноября 2011

Вы должны инициализировать свойства экземпляра в конструкторе:

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

Каждое значение, присвоенное свойству RPSPlayer.prototype, совместно используется всеми экземплярами (что является одной из целей прототипа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...