Member 13621370 Ответов: 1

Почему приведенный ниже код регистрирует мутировавший объект в строке 42, когда метод update вызывается ниже него, в строке 46.


var Test = (function() {
  var objects = [];
  var InnerObject = {
    init: function(data) {
      this.prop1 = data.prop1 || 'first';
      this.prop2 = data.prop2 || 'second';
      this.prop3 = data.prop3 || 'third';
      return this;
    }
  };
  return {
    init: function(data) {
      data.forEach(function (item) {
        var obj = Object.create(InnerObject).init(item);
        objects.push(obj);
      });
      return this;
    },
    update: function(idx) {
      var testObj = objects[idx];
      for (var prop in testObj) {
        testObj[prop] = '1';
      }
      return obj;
    },
    list: function() {
      return objects.slice();
    }
  }
})();

var item = {
  prop1: 'newFirst',
  prop2: 'newSecond',
  prop3: 'newThird'
}

var data = [item];

var obj = Object.create(Test).init(data);

console.log(obj.list()); // why the property value of each element here is 1
                         //when we are invoking update method below

//without update method it would log values newFirst and so on...
obj.update(0);


Что я уже пробовал:

Этот код работает...Он создает тестовый объект, и когда этот тестовый объект инициализируется, InnerObject создается и помещается в массив объектов.

метод list() возвращает копию массива объектов.

Я регистрирую возвращаемое значение метода list() в строке 42 и ниже него, в строке 46, обновляю объект в массиве объектов (мутируя его).

Чего я не понимаю, так это почему эта мутация отражается на строке 42, когда эта строка должна быть выполнена до строки 46.

1 Ответов

Рейтинг:
0

Bohdan Stupak

Согласно с этот[^]
ваш код выполняется правильно, но состояние вашего объекта извлекается после выполнения всего кода.
Так что здесь нет ничего плохого в потоке javascript. И действительно, если вы обновите свой код с помощью

console.log(obj.list()[0].prop1) //it is newFirst as expected
 console.log(obj.list()); // why the property value of each element here is 1
                          //when we are invoking update method below

 //without update method it would log values newFirst and so on...
 obj.update(0);

вы получите ожидаемый результат, как я уже сказал в комментарии