Javascript 强制内存中的对象指向其他对象?

Javascript 强制内存中的对象指向其他对象?,javascript,Javascript,考虑以下几点: var obj1 = {"value":"one"}; var obj2 = obj1; console.log(obj2.value+"\n"); // prints "one" obj1 = {"value":"two"}; console.log(obj2.value+"\n"); // still prints "one" 我理解其原因,在前两行中,obj1和obj2都是指向同一对象的引用,{“value”:“one”},内存中的某个地方。当obj1被分配给

考虑以下几点:

var obj1 = {"value":"one"};
var obj2 = obj1;
console.log(obj2.value+"\n");    // prints "one"
obj1 = {"value":"two"};
console.log(obj2.value+"\n");    // still prints "one"
我理解其原因,在前两行中,
obj1
obj2
都是指向同一对象的引用,
{“value”:“one”}
,内存中的某个地方。当
obj1
被分配给不同的对象时,
{“value”:“two”}
obj2
仍指向内存中的同一对象
{“value”:“one”}

我正在寻找的是一种强制内存中的
{“value”:“one”}
对象将其调用者“重定向”到
{“value”:“two”}
对象的方法。换句话说,我正在寻找一种操作
{“value”:“one”}
对象的方法,以便
obj2
变量最终指向
{“value”:“two”}
对象,而无需重新分配
obj2
变量:

var obj1 = {"value":"one"};
var obj2 = obj1;
console.log(obj2.value+"\n");    // prints "one"
// ...some code to manipulate the `{"value":"one"}` object in memory
// so that *any* references which originally pointed to the
// `{"value":"one"}` object now point to the `{"value":"two"}`
// object, like a sort of "redirection".  This would be done
// without ever explicitly reassigning the references.
console.log(obj2.value+"\n");    // now prints "two"
有没有办法做到这一点

实际的应用程序涉及一些相当复杂的Mozilla代码,这会阻碍这个线程的尝试和解释,所以我把它作为一个一般的理论问题来问

编辑:结论:

“不”是对实际问题最正确的回答,torazaburo下面的评论很好地说明了这一点。然而,我觉得帕特里克的答案,使用代理,最接近于实现这一点,所以我接受了他的答案。我要补充的是,虽然代理是非常强大的工具,但它们与实际的目标对象不同,并且存在一些限制。

我认为将以最佳方式指导您处理此行为。不可能简单地将一个对象重定向到另一个对象,但您可以简单地修改其值,使其与您试图更改的对象匹配

还可以定义全局对象:

var objs = {
    1: {value: 'test'}
    2: {value: 'test2'}
};
从这里开始,传递一个对象,该对象的值为您试图模拟的键。只需更改键,然后引用新元素

例如:

var obj = {key: 1};
console.log(objs[obj.key]);
//Outputs: {value: 'test'}

obj.key = 2;
console.log(objs[obj.key]);
//Outputs: {value: 'test2'}
我认为这将以最好的方式引导你处理这种行为。不可能简单地将一个对象重定向到另一个对象,但您可以简单地修改其值,使其与您试图更改的对象匹配

还可以定义全局对象:

var objs = {
    1: {value: 'test'}
    2: {value: 'test2'}
};
从这里开始,传递一个对象,该对象的值为您试图模拟的键。只需更改键,然后引用新元素

例如:

var obj = {key: 1};
console.log(objs[obj.key]);
//Outputs: {value: 'test'}

obj.key = 2;
console.log(objs[obj.key]);
//Outputs: {value: 'test2'}
退房。可以使用
get
set
动态引用所选的基本对象,将代理公开为要隐式更新的自由浮动引用。下面是一个例子:

var obj = {key: 1};
console.log(objs[obj.key]);
//Outputs: {value: 'test'}

obj.key = 2;
console.log(objs[obj.key]);
//Outputs: {value: 'test2'}
函数可代理(目标){
this.target=目标;
this.proxy=新代理(this,Proxyable.handler);
}
Proxyable.prototype.getReference=函数(){
返回此.proxy;
};
Proxyable.prototype.setReference=函数(目标){
this.target=目标;
};
Proxyable.handler={
获取:函数(可代理,属性){
返回可代理的.target[属性];
},
集合:函数(可代理、属性、值){
返回可代理的。目标[属性]=值;
}
};
//原物
var original={value:['one']};
//不幸的是,我们必须创建一个名称空间
var nsp=新的可代理(原始);
//引用命名空间的ref值
var ref1=nsp.getReference();
var ref2=nsp.getReference();
//相同的引用(不仅仅是值)
console.log(ref1.value==原始.value);
console.log(ref2.value==原始.value);
//将替换对象热加载到原始对象上
变量替换={value:['two']};
//进入名称空间
nsp.设置参考(替换);
//旧的参考文献被打破了
console.log(ref1.value!==原始.value);
console.log(ref2.value!==原始.value);
//新的参考文献
console.log(ref1.value==replacement.value);
console.log(ref2.value==replacement.value)签出。可以使用
get
set
动态引用所选的基本对象,将代理公开为要隐式更新的自由浮动引用。下面是一个例子:

var obj = {key: 1};
console.log(objs[obj.key]);
//Outputs: {value: 'test'}

obj.key = 2;
console.log(objs[obj.key]);
//Outputs: {value: 'test2'}
函数可代理(目标){
this.target=目标;
this.proxy=新代理(this,Proxyable.handler);
}
Proxyable.prototype.getReference=函数(){
返回此.proxy;
};
Proxyable.prototype.setReference=函数(目标){
this.target=目标;
};
Proxyable.handler={
获取:函数(可代理,属性){
返回可代理的.target[属性];
},
集合:函数(可代理、属性、值){
返回可代理的。目标[属性]=值;
}
};
//原物
var original={value:['one']};
//不幸的是,我们必须创建一个名称空间
var nsp=新的可代理(原始);
//引用命名空间的ref值
var ref1=nsp.getReference();
var ref2=nsp.getReference();
//相同的引用(不仅仅是值)
console.log(ref1.value==原始.value);
console.log(ref2.value==原始.value);
//将替换对象热加载到原始对象上
变量替换={value:['two']};
//进入名称空间
nsp.设置参考(替换);
//旧的参考文献被打破了
console.log(ref1.value!==原始.value);
console.log(ref2.value!==原始.value);
//新的参考文献
console.log(ref1.value==replacement.value);

console.log(ref2.value==replacement.value)没有办法直接做你想做的事。由于您在问题中所述的原因,这就是javascript中变量和值的工作方式

然而,你自己在问题中的话暗示了一种实现某些可能有效的方法。但是,根据您处理的代码,它可能不是您想要的

您可以简单地将对象包装到另一个引用中。因此,更改引用的内容会更改共享引用的所有变量所指向的对象。您可以使用两个可用的引用容器之一:对象或数组:

// This works:
var obj1 = [{value:'one'}];
var obj2 = obj1;

var obj1[0] = {value:'two'};

console.log(obj1[0]); // prints {"value":"two"}
console.log(obj2[0]); // prints {"value":"two"}
或者:

// This also works:
var obj1 = {obj:{value:'one'}};
var obj2 = obj1;

var obj1.obj = {value:'two'};

console.log(obj1.obj); // prints {"value":"two"}
console.log(obj2.obj); // prints {"value":"two"}

没有办法直接做你想做的事。对于虚拟企业