【问题标题】:Is there a practical use for copying an object by reference?通过引用复制对象有实际用途吗?
【发布时间】:2012-01-28 04:57:54
【问题描述】:

Javascript 通过引用而不是字面的方式复制对象。例如:

var myObject = {};
var myCopy = myObject;

myObject.foo = "bar";

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

但除了为开发人员提供一种使代码更具可读性的方法(因为您可以为同一个对象的不同用途提供不同的名称)之外,我真的很难想出实际的、真实的原因。

最有可能的是我错过了重点,那么谁能告诉我重点是什么?

【问题讨论】:

  • 对于这种行为,我根本不会使用“复制”这个词。您只是为两个变量分配对同一对象的引用;这与将数字 5 分配给两个变量没有什么不同。我无法想象你会用这种语言做什么才能使这样的任务不可能成为可能。

标签: javascript oop object


【解决方案1】:

视情况而定;在您的情况下,这可能会令人困惑,因为它没有真正的用途。但是,对于到对象的较长路径,将对象存储在单独的变量中可能是有利的,因为它需要为使用该对象的每个语句进行更少的键入,例如在此示例中:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      写完之后:

      var myObject = {};
      

      内存中有一个对象,您可以通过名称myObject 引用它。以下作业:

      var myCopy = myObject;
      

      ...说myCopy 现在指的是同一个对象,无论它在哪里。当你给一个函数一个参数时,会发生同样的事情:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 2012-02-17
        • 2011-02-12
        • 2010-12-08
        • 2020-07-02
        • 2013-06-14
        相关资源
        最近更新 更多