Рассмотрим этот пример:
Если бы вы взяли приведенный выше код и запустили его, консольное сообщение было бы 100. Почему он распечатывает 100, когда я добавил 100 в позицию в obj2 "this"? Как мне сделать так, чтобы у obj2 было свое уникальное «это»? Также, пожалуйста, знайте, что это упрощенный пример моего кода, я не могу просто создать отдельный объект в obj2, который содержит все.
var obj1 = function() {
this.obj2Arr = [];
this.pos = {
"x": 0,
"y": 0
};
this.obj2Arr.push(new obj2(this.pos));
console.info(this.pos.x);
// Prints out 100 even though obj2 was where I added the 100 for it's "this".
// Why does it do that, and how do I make obj2's "this" unique to it?
};
var obj2 = function(pos) {
this.pos = pos;
this.pos.x = this.pos.x + 100;
};
var example = new obj1();
console.info(example);Итак, как мне сделать позицию для obj2 уникальной?
Альтернативой является использование синтаксиса Spread new obj2({...this.pos}) или new obj2(Object.assign({}, this.pos)).
@ KingCoder11 Вам нужно будет создать копию / клон pos. Это не происходит автоматически с объектами. - Как правильно клонировать объект JavaScript?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это связано с тем, что pos является объектом, а объекты всегда передаются по ссылке в javascript.
Чтобы ответить на ваш вопрос: используйте Object.assign для создания нового объекта:
var obj1 = function() {
this.obj2Arr = [];
this.pos = {
"x": 0,
"y": 0
};
this.obj2Arr.push(new obj2(Object.assign({}, this.pos)));
console.info(this.pos.x);
};
var obj2 = function(pos) {
this.pos = pos;
this.pos.x = this.pos.x + 100;
};
var example = new obj1();
console.info(example);
Объекты - это «ссылочный тип», который передается по значению, поэтому копируется только ссылка. На самом деле они не передаются «по ссылке».
Это клонирование только первого уровня, а не всего объекта. Вы должны это объяснить.
У вас есть ссылка на тот же
obj posв памяти, поэтому вы модифицируете тот жеposизobj1.