【问题标题】:Is JavaScript object (reference type) returned by reference?JavaScript 对象(引用类型)是通过引用返回的吗?
【发布时间】:2016-05-18 20:55:29
【问题描述】:

我有代码:

function Contract() {
  var contract = {};
  contract.id = ...;
  contract.date = ...;

  contract.calculateTotal = function() {
  ...
  }

  return contract;
}

问题是——Contract() 的结果会发生什么?每次都用 ={} 重新创建合约吗?这个问题与AngularJS模型层的设计有关。 Contract() 应该用作创建新模型层对象的构造函数。 Contract() 将是单例的,真正的问题是 - 每次调用 Contract() 是否都会创建新对象,或者是否有一个合约对象位于单例 Contract() 中,并且每次调用 Contract 时都会返回相同的实例()?

【问题讨论】:

  • 这似乎很容易测试
  • 每次{} 文字被计算时,它都会创建一个新对象,并且对象总是通过引用来处理。
  • 您说的是“Contract() 将是单身”,但随后询问contract = {} 每次 Contract() 会发生什么实例化。没有意义。 singleton 是一个只能被实例化一次的对象(设计模式)。您的代码中没有任何内容阻止我根据需要多次实例化Contract()

标签: javascript angularjs object


【解决方案1】:

问题是——Contract() 的结果会发生什么?

它过着自己的生活,不受未来调用Contract的影响。

每次都用 ={} 重新创建合约吗?

是的,每次调用函数时,var 语句都会创建一个新变量。

Contract() 将是单例

它不是单例。

真正的问题是 - 如果每次调用 Contract() 都会创建一个新对象,或者是否有一个合约对象位于单例 Contract() 中,并且每次调用 Contract() 时都返回相同的实例?

Contract() 的每次调用都会创建一个新对象。

单例

有几种方法可以实现单例。一种方法是将第一个创建的实例作为Contract 函数的属性进行跟踪:

function Contract() {
  if (Contract.singleton) return Contract.singleton;
  var contract = {};
  contract.id = ...;
  contract.date = ...;

  contract.calculateTotal = function() {
  ...
  }
  // keep a reference in the singleton property of this constructor
  return Contract.singleton = contract;
}

【讨论】:

    【解决方案2】:

    每次调用Contract() 函数时,它都会创建一个新的空对象并将其分配给contract,然后从函数中返回它。所以,是的,每次调用你的函数都会返回一个对象的新实例,是的,它是通过引用返回的,所以返回的实例是在你的函数中创建并分配给 contract 的实例。

    【讨论】:

      【解决方案3】:

      尝试以下方法进行测试:

      function contract() {
       contract = {};
       contract.id = 1;
       contract.date = 1991;
      
       return contract;
      }
      
      var contract1 = contract();
      var contract2 = contract();
      
      contract1.id = 2;
      
      console.log(contract1); // Object {id: 2, date: 1991}
      console.log(contract2); // Object {id: 1, date: 1991}
      

      显然,每次调用 contract 时都会创建一个新对象。

      【讨论】:

        猜你喜欢
        • 2012-08-20
        • 1970-01-01
        • 2010-11-22
        • 1970-01-01
        • 2012-02-13
        • 2016-12-04
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多