首页 > 解决方案 > 是否可以通过引用传递或访问实际对象?

问题描述

我了解 javascript 始终是“按值传递”。即使在分配对象时,它也会传递一个,该值是对该对象的引用。

1: var obj1 = {name: "bob"};
2: var obj2 = obj1;
3: obj2.name = "joe";
4: console.log(obj1.name);    // output: "joe"
5: obj2 = {name: "ron"};
6: console.log(obj1.name);    // output: "joe"

在第 4 行,两者都obj1包含obj2对同一个对象的引用,并且我们能够通过这两个变量来操作该对象。但是第 5 行设置obj2为引用一个新对象。现在obj1obj2引用了 2 个不同的对象。到目前为止,这一切都说得通。

我的问题是:有没有办法访问对象本身而不仅仅是引用它?因此,我们可以将其更改为一个全新的对象,并且引用它的任何变量现在都将引用新对象,而不是简单地操作对象?像这样的东西:

var obj1 = {name: "bob"};
var obj2 = obj1;
var actualObject = GetActualObjectReferencedBy(obj2);
actualObject = new Date();
console.log(obj1)      // output: the current date;
console.log(obj2)      // output: the current date;

所以actualObject就是这样。一切所指的实际对象,而不仅仅是引用。对其进行任何更改都不会破坏参考。

这是我为什么要这样做的一个例子:

function Person(n){
  this.name = n;
}
function attachProxies(){
  for(var i = 0; i < arguments.length; i++){
    var actualObject = GetActualObject(arguments[i]);
    actualObject = new Proxy(actualObject, {
      get: function(obj, prop){ return "I'm " + obj[prop]; };
    });
  }
}

var guy1 = new Person("bob");
var guy2 = new Person("joe");
var guy3 = new Person("rom");
attachProxies(guy1, guy2, guy3);

console.log(guy2.name);    // output: "I'm joe"

我能想到的最接近的是:

function attachProxies(obj){
  return new Proxy(obj, {
    get: function(obj, prop){return "I'm "+obj[prop];};
  });
}
var guy1 = new Person("bob");
var guy2 = new Person("joe");
var guy3 = new Person("rom");
guy1 = attachProxies(guy1);
guy2 = attachProxies(guy2);
guy3 = attachProxies(guy3);

但这更加有限和重复。

我试过环顾四周,但似乎找不到任何方法。如果不可能,请帮助我理解原因。

编辑:

我不认为这算作重复,因为我在设置中承认我的问题是 javascript 按值传递。假定的重复项仅说明但没有回答我是否有任何方式访问该对象的问题。

标签: javascript

解决方案


不,这是不可能的。您无法访问存储对象内容的内存并将它们替换为取自另一个对象的不同内容。

好吧,你可以这样做,但方式有限。您可以通过简单地为其分配新值来更改对象的内容,主要是对象的属性。您甚至可以将其原型链替换为Object.setPrototypeOf. (假设对象未冻结或不可配置)。

但是您绝对不能做的是将对象替换为不同内部类型的对象,例如将普通对象文字对象替换为Date偶数 a 的实例Proxy。这基本上是不可能的。

您的“最接近的事情”解决方案确实是您可以做的最接近的事情,它涉及为存储旧参考的所有位置(在您的情况下为变量)分配新的参考值。但是,如果您的包装函数支持语法,则可以减少重复性

[guy1, guy2, guy3] = attachProxies(guy1, guy2, guy3);

推荐阅读