Почему после вызова функции меняется объект? Есть вот такой, упрощенный код:var Game = function (players) {
this.game = {
players: []
};
console.log(this.getStateWithMe(players[0]).players); //тут все нормально
console.log(this.getStateWithMe(players[1]).players); //а тут this.game уже изменен
}
Game.prototype = {
getStateWithMe: function (player) {
//функция должна возвращать модифицированную копию this.game
var g = {};
for (prop in this.game) if (this.game.hasOwnProperty(prop)) {
g[prop] = this.game[prop];
}
g.players.push(player);
return g;
}
}
new Game(['a', 'b']);
Я пытаюсь реализовать функцию получения дочернего объекта, в зависимости от параметра. Но проблема в том, что прототипная функция getStateWithMe() изменяет сам объект.
Как я понял это из-за того, что var создает ссылку на объект, а не его копию.
Как это поправить, оставив функцию в прототипе?

21 Авг 2019 в 07:07
222 +1
0
Ответы
1

Да, проблема действительно заключается в том, что вы создаете ссылку на объект this.game, а не его копию. Вместо этого вам нужно сделать глубокое копирование объекта this.game, чтобы изменения в копии не влияли на оригинал.

Вот как вы можете исправить ваш код:

var Game = function (players) {
this.game = {
players: []
};
console.log(this.getStateWithMe(players[0]).players);
console.log(this.getStateWithMe(players[1]).players);
}
Game.prototype = {
getStateWithMe: function (player) {
var g = JSON.parse(JSON.stringify(this.game)); // глубокое копирование объекта
g.players.push(player);
return g;
}
}
new Game(['a', 'b']);

Теперь ваша функция getStateWithMe() создает глубокую копию объекта this.game, и изменения возвращенной копии не затрагивают оригинал. Ваши консольные логи должны показывать правильные результаты без изменения оригинального объекта this.game.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир