替换对象并保留指向该对象的现有指针

时间:2019-02-14 08:48:14

标签: javascript typescript reference

在不丢失javascript中的链接指针的情况下,我找不到替换对象的方法。

在我的场景中,我创建了一些对象

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

现在在某些时候我想用另一个对象(例如C ++中的指针)替换该对象

我可以用另一个对象的参数重写整个对象,但是我更喜欢替换它:

a = new someObject();

现在这仅将a与当前对象分离,以使其指向新对象,我想要的是用新对象替换该对象,以便数组内的引用指向此新对象。这可能吗?

2 个答案:

答案 0 :(得分:1)

有两种方法可以解决您的问题,但大多数方法都需要更改函数的签名。

一种实现方法是为该对象创建一个getter函数,然后传递该函数而不是对象本身。

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;

最后,如果不需要引用原始对象,则可以替换所有字段,而无需创建新对象(假设没有私有字段)。

答案 1 :(得分:0)

您不应该重新分配给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();