Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以通过引用传递或访问实际对象?_Javascript - Fatal编程技术网

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

Javascript 是否可以通过引用传递或访问实际对象?,javascript,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行,obj1和

我知道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设置为引用新对象。现在,obj1和obj2引用了两个不同的对象。到目前为止,这一切都是有道理的

我的问题是:有没有办法访问对象本身而不仅仅是引用它?这样,我们就不用简单地操纵对象,而是可以将其更改为一个全新的对象,而引用它的任何变量现在都会引用新对象?大概是这样的:

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;
所以实际的对象就是这样。所有事物都引用的实际对象,而不仅仅是引用。对其进行任何更改都不会破坏引用

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

但这是非常有限和重复的

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

编辑:


我不认为这算是重复,因为我在问题的设置中承认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"
嗯,你可以这样做,但方式有限。只需为对象指定新值,即可更改对象的内容(主要是对象的属性)。您甚至可以使用Object.setPrototypeOf交换其原型链。假设对象未冻结或不可配置

但是,您绝对不能将对象替换为不同内部类型的对象,例如,将普通对象文本对象替换为代理的日期实例。这根本不可能

您的“最近的事情”解决方案实际上是您能做的最接近的事情,它涉及到为案例中的所有位置分配新的引用值,即存储旧引用的变量。但是,如果包装器函数支持语法,则可以减少重复性

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

没有办法做到你在JavaScript中所描述的。可能重复的是,这个特定的答案描述了我在问题设置中已经知道和陈述的内容。但这不是我真正的问题。@我相信你,但你知道这背后有什么特别的原因吗?我思考这个问题的方式有缺陷吗?有没有一篇文章可以帮我理解它?所以基本上我只需要重新构建我思考它的方式。要么像你的例子那样写。或者甚至做一些像var guys=[guy1,guy2,guy3];attachProxiesguys@tylermackenzie使用这种语法,您可以更改guys数组的元素,但决不能让guy1、guy2和guy3变量引用新的代理。我想我必须在阵列中始终使用它们。
[guy1, guy2, guy3] = attachProxies(guy1, guy2, guy3);