"this" доступен внутри массива другого объекта "this" - javascript

Рассмотрим этот пример:

Если бы вы взяли приведенный выше код и запустили его, консольное сообщение было бы 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);

У вас есть ссылка на тот же obj pos в памяти, поэтому вы модифицируете тот же pos из obj1.

Ele 10.03.2018 18:50

Итак, как мне сделать позицию для obj2 уникальной?

KingCoder11 10.03.2018 18:51

Альтернативой является использование синтаксиса Spread new obj2({...this.pos}) или new obj2(Object.assign({}, this.pos)).

Ele 10.03.2018 18:52

@ KingCoder11 Вам нужно будет создать копию / клон pos. Это не происходит автоматически с объектами. - Как правильно клонировать объект JavaScript?

Jonathan Lonowski 10.03.2018 18:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это связано с тем, что 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);

Объекты - это «ссылочный тип», который передается по значению, поэтому копируется только ссылка. На самом деле они не передаются «по ссылке».

user9366559 10.03.2018 18:56

Это клонирование только первого уровня, а не всего объекта. Вы должны это объяснить.

Ele 10.03.2018 18:57

Другие вопросы по теме