强迫存在于内存中的对象指向另一个对象?

阿拉索

考虑以下:

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用代理服务器的答案最接近于完成此任务,因此我接受了他的回答。我将补充一点,尽管代理是非常强大的工具,但它们与实际的目标对象并不相同,并且存在一些限制。

帕特里克·罗伯茨

检查代理您可以使用getset来动态引用您选择的基础对象,将代理作为要隐式更新的自由浮动引用公开。这是一个例子:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

检查键/值对是否存在于另一个对象中

来自分类Dev

当对象键存在于javascript中另一个对象的数组中时,重组对象数据

来自分类Dev

如何判断对象的所有值是否存在于另一个对象中

来自分类Dev

检查对象值数组是否存在于另一个数组中,但长度不同

来自分类Dev

检查对象是否存在于另一个模型外键字段中

来自分类Dev

检查一个对象中的项目是否存在于另一个对象中(使用下划线)

来自分类Dev

如何检查一个JavaScript对象中的值是否存在于另一个JavaScript对象中?

来自分类Dev

检查一个对象中的项目是否存在于另一个对象中(使用下划线)

来自分类Dev

如何检查一个 json 对象数组中的 id 是否存在于另一个 json 对象嵌套数组中?

来自分类Dev

遍历一个IQueriable(对象A)并检查属性是否存在于另一个IQueriable(对象B)中

来自分类Dev

如果对象键存在于另一个数组中,则在重新选择选择器中使用键控对象扩充对象

来自分类Dev

如何将一个数组添加到存在于mongodb对象中的另一个数组中

来自分类Dev

reactjs如何过滤/检查数组中的任何对象是否存在于另一个对象数组中?

来自分类常见问题

Android Room查询对象具有至少一个存在于另一个列表中的项目

来自分类Dev

Android Room查询对象具有至少一个存在于另一个列表中的项目

来自分类Dev

要求记录存在,如果它们存在于MySQL的另一个表中

来自分类Dev

Python:比较列表中的值(如果存在于另一个列表中)

来自分类Dev

如何搜索列表中的数字是否存在于另一个列表中?

来自分类Dev

列值必须存在于另一个表的非主列中

来自分类Dev

检查数组的元素是否存在于PHP的另一个数组中

来自分类Dev

MySQL查询按存在于另一个表中

来自分类Dev

设置属性(如果存在于另一个列表中)

来自分类Dev

检查数组值是否存在于另一个数组中

来自分类Dev

检查列表是否存在于另一个列表中

来自分类Dev

如果该行的字段存在于另一个文件中,则删除该行

来自分类Dev

Java8-数组项存在于另一个数组中

来自分类Dev

列值必须存在于另一个表的非主列中

来自分类Dev

MySQL 查询不存在于另一个表中

来自分类Dev

仅显示存在于另一个数组中的数组元素

Related 相关文章

  1. 1

    检查键/值对是否存在于另一个对象中

  2. 2

    当对象键存在于javascript中另一个对象的数组中时,重组对象数据

  3. 3

    如何判断对象的所有值是否存在于另一个对象中

  4. 4

    检查对象值数组是否存在于另一个数组中,但长度不同

  5. 5

    检查对象是否存在于另一个模型外键字段中

  6. 6

    检查一个对象中的项目是否存在于另一个对象中(使用下划线)

  7. 7

    如何检查一个JavaScript对象中的值是否存在于另一个JavaScript对象中?

  8. 8

    检查一个对象中的项目是否存在于另一个对象中(使用下划线)

  9. 9

    如何检查一个 json 对象数组中的 id 是否存在于另一个 json 对象嵌套数组中?

  10. 10

    遍历一个IQueriable(对象A)并检查属性是否存在于另一个IQueriable(对象B)中

  11. 11

    如果对象键存在于另一个数组中,则在重新选择选择器中使用键控对象扩充对象

  12. 12

    如何将一个数组添加到存在于mongodb对象中的另一个数组中

  13. 13

    reactjs如何过滤/检查数组中的任何对象是否存在于另一个对象数组中?

  14. 14

    Android Room查询对象具有至少一个存在于另一个列表中的项目

  15. 15

    Android Room查询对象具有至少一个存在于另一个列表中的项目

  16. 16

    要求记录存在,如果它们存在于MySQL的另一个表中

  17. 17

    Python:比较列表中的值(如果存在于另一个列表中)

  18. 18

    如何搜索列表中的数字是否存在于另一个列表中?

  19. 19

    列值必须存在于另一个表的非主列中

  20. 20

    检查数组的元素是否存在于PHP的另一个数组中

  21. 21

    MySQL查询按存在于另一个表中

  22. 22

    设置属性(如果存在于另一个列表中)

  23. 23

    检查数组值是否存在于另一个数组中

  24. 24

    检查列表是否存在于另一个列表中

  25. 25

    如果该行的字段存在于另一个文件中,则删除该行

  26. 26

    Java8-数组项存在于另一个数组中

  27. 27

    列值必须存在于另一个表的非主列中

  28. 28

    MySQL 查询不存在于另一个表中

  29. 29

    仅显示存在于另一个数组中的数组元素

热门标签

归档