是否有通过引用复制对象的实际用途?

时间:2011-12-26 22:45:42

标签: javascript oop object

Javascript通过引用复制对象,而不是字面上。例如:

var myObject = {};
var myCopy = myObject;

myObject.foo = "bar";

alert(myCopy.foo); //alerts "bar"

但是,除了给开发人员提供一种使代码稍微更具可读性的方法之外,我真的很难想到实际的,现实世界的原因(因为你可以为同一个对象提供不同的名称)。

最可能的事情是我错过了这一点,所以有人能告诉我这是什么意思吗?

3 个答案:

答案 0 :(得分:4)

写完后:

var myObject = {};

在内存中有一个对象可以通过名称myObject引用。以下任务:

var myCopy = myObject;

...说myCopy现在指的是同一个对象,无论它在哪里。这与为函数提供参数时发生的情况相同:

function somefunc(localName) {
    // body
}
someFunc(myCopy);

现在有一个名为localName的变量 local someFunc ,它也引用了内存中的同一个对象。

这是我们传递对象引用的基本方式,因此可以在不同的范围内通过不同的名称引用它。

我们可以将整个结构复制到内存中的新位置。没有什么能阻止设计师创造一种能够做到这一点的语言。但效率较低 - 想想深层嵌套的对象 - 通常不是你想做的事情。例如,如果函数修改了对象的一个​​属性,则需要将该更改的整个对象返回到函数外部。调用者需要处理该返回值,决定是否需要保留旧对象,或者新创建的略有不同的副本是否可以覆盖它。

同样,原则上这个设计方向并没有错;它不是JavaScript的设计方式。

答案 1 :(得分:1)

取决于;在你的情况下,它可能会相当混乱,因为它不能用于真正的目的。但是,对于到对象的较长路径,将对象存储在单独的变量中可能是有利的,因为对于使用该对象的每个语句,它需要较少的类型,例如在此示例中:

var style = document.getElementById("foo").style;

style.color = "red";
style.font = "sans-serif";
// ...

答案 2 :(得分:0)

我的观点(并且它只不过是这一点)是通过引用(而不是复制)创建对象通常更有用并且用户想要什么。如果将对象作为参数传递给方法,则您(几乎总是)对该方法所处理和更改的对象感兴趣,而不是通过处理副本(并保持原始状态不变)。显然有些情况下这是不正确的,有选择的选择会很好,但是我不记得曾经发现自己希望我可以将对象副本传递给方法,并且我通常非常感谢我与之合作的事情就是这件事。

相关问题