考虑以下:
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的评论很好地说明了这一点。但是我觉得Patrick用代理服务器的答案最接近于完成此任务,因此我接受了他的回答。我将补充一点,尽管代理是非常强大的工具,但它们与实际的目标对象并不相同,并且存在一些限制。
检查代理。您可以使用get
和set
来动态引用您选择的基础对象,将代理作为要隐式更新的自由浮动引用公开。这是一个例子:
function Proxyable(target) {
this.target = target;
this.proxy = new Proxy(this, Proxyable.handler);
}
Proxyable.prototype.getReference = function () {
return this.proxy;
};
Proxyable.prototype.setReference = function (target) {
this.target = target;
};
Proxyable.handler = {
get: function (proxyable, property) {
return proxyable.target[property];
},
set: function (proxyable, property, value) {
return proxyable.target[property] = value;
}
};
// original object
var original = { value: ['one'] };
// have to create a namespace unfortunately
var nsp = new Proxyable(original);
// reference the ref value of the namespace
var ref1 = nsp.getReference();
var ref2 = nsp.getReference();
// same references (not just values)
console.log(ref1.value === original.value);
console.log(ref2.value === original.value);
// hot-load a replacement object over the original
var replacement = { value: ['two'] };
// into the namespace
nsp.setReference(replacement);
// old references broken
console.log(ref1.value !== original.value);
console.log(ref2.value !== original.value);
// new references in place
console.log(ref1.value === replacement.value);
console.log(ref2.value === replacement.value);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句