Почему после вызова функции меняется объект? Есть вот такой, упрощенный код: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 создает ссылку на объект, а не его копию. Как это поправить, оставив функцию в прототипе?
Да, проблема действительно заключается в том, что вы создаете ссылку на объект 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.
Да, проблема действительно заключается в том, что вы создаете ссылку на объект 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.