在不丢失javascript中的链接指针的情况下,我找不到替换对象的方法。
在我的场景中,我创建了一些对象
var a = new someObject();
selectedbyUser.push(a);
objectWithissues.push(a);
objectBeingreviewed.push(a);
...
现在在某些时候我想用另一个对象(例如C ++中的指针)替换该对象
我可以用另一个对象的参数重写整个对象,但是我更喜欢替换它:
a = new someObject();
现在这仅将a与当前对象分离,以使其指向新对象,我想要的是用新对象替换该对象,以便数组内的引用指向此新对象。这可能吗?
答案 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();