@dimentimor

Как правильно копировать объект?

Здравствуйте!

Почему в первом объекте оказывается сообщение? Должно же только во втором..

var Terminal = {
	inbox: [],
	sendMail: function (target, message) {
		target.inbox.push({ terminal: this.name, message });
	}
};

var t1 = Object.assign({}, Terminal, { name: 'Jack' });
var t2 = Object.assign({}, Terminal, { name: 'Alice' });

t1.sendMail(t2, 'Hello Alice');
console.log(t1);
// { 
// 	inbox: [{ terminal: 'Jack', message: 'Hello Alice' }],
// 	sendMail: [Function: sendMail],
// 	name: 'Jack'
// }


Object.assign({}, Terminal, {});
Разве Terminal не должен оставаться нетронутым? Мы ведь из него копируем свойства в пустой объект.

UPD

Ничего не понимаю
console.log(t1.inbox === t2.inbox); // true
  • Вопрос задан
  • 128 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Object.assign() работает так же, как
var t1 = {};
t1.inbox = Terminal.inbox; // там массив, он по ссылке передаётся
t1.sendMail = Terminal.sendMail; // функция - тоже по ссылке, тоже будет === с t2


Это как с массивами.
Если надо не один и тот же изменять, а разные иметь, приходится делать slice(), чтобы получить независимую копию.
var a = [1,2,3];
var b = a;
b.pop(); // a === b; a: [1,2];
// plan-b:
var a = [1,2,3];
var b = a.slice();
b.pop(); // b !== a;  a: [1,2,3]; b: [1,2]


Можно использовать функцию-конструктор.
Примерно так
function factory(props) {
  var Terminal = {
    inbox: [],
    sendMail: function (target, message) {
      target.inbox.push({ terminal: this.name, message });
    }
  };
  
  return Object.assign(Terminal, props);
}

var t1 = factory({ name: 'Jack' });
var t2 = factory({ name: 'Alice' });
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы