Заменить объект и сохранить существующие указатели на этот объект - PullRequest
0 голосов
/ 14 февраля 2019

Я не могу найти способ заменить объект, не потеряв связанных указателей в javascript.

В моем сценарии я создаю некоторый Объект

var a = new someObject();
selectedbyUser.push(a);
objectWithissues.push(a);
objectBeingreviewed.push(a);
...

Теперь в какой-то момент я быхотел бы заменить этот объект другим (как указатели в C ++)

Я мог бы переписать весь объект с аргументами другого объекта, но я бы предпочел заменить его:

a = new someObject();

теперь это только отсоединяет a от текущего объекта, чтобы он указывал на новый объект. Я хочу заменить объект новым объектом, чтобы ссылки внутри массивов указывали на этот новый объект. Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Вы не должны переназначаться на a, в противном случае вы назначите ссылку на новый объект на a, но вы можете заменить объект, на который указывает a, Object.assign():

class A {
  constructor(val) {
    this.b = val;
  }
  
  sayHi() {
    console.log('val is', this.b);
  }
}

const arr = [];

const a = new A(1);
arr.push(a);

console.log(JSON.stringify(arr));
arr[0].sayHi();

Object.assign(a, new A(2));

console.log(JSON.stringify(arr));
arr[0].sayHi();
0 голосов
/ 14 февраля 2019

Есть несколько способов сделать то, что вы просите, но большинство из них требуют изменения сигнатуры функций.

Один из способов сделать это - создать функцию получения для этого объекта, ипередать эту функцию вместо самого объекта.

var a = 5;

function getA() {
  return a;
}

function test(getObj) {
  console.log(getObj());
  setTimeout(function() {
    console.log(getObj());
  }, 250);
}

test(getA);

a = 2;

Другим способом было бы обернуть объект другим объектом, заставить все функции сохранять ссылку на родительский объект, и при каждом изменении ссылки не будет никакихдругие ссылки на этот объект остались.

var wrapper = {
  a: 5
};

function test(wrap) {
  console.log(wrap.a);
  setTimeout(function() {
    console.log(wrap.a);
  }, 250);
}

test(wrapper);

wrapper.a = 2;

Наконец, если вам не нужна ссылка на исходный объект, вы можете просто заменить все поля вместо создания нового объекта (при условии, что нет закрытыхполя).

...