是否可以通过引用传递或访问实际对象?

时间:2019-03-03 19:36:35

标签: javascript

我了解到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行上,obj1obj2都包含对同一对象的引用,并且我们能够通过两个变量来操纵该对象。但是第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按值传递。假定的重复项仅说明但未回答我是否有任何方式访问对象的问题。

1 个答案:

答案 0 :(得分:1)

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

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

但是,您绝对不能做的是将对象替换为其他内部类型的对象,例如,将普通的普通对象转换为Date的{​​{1}}实例。从根本上讲这是不可能的。

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

Proxy