是引用返回的JavaScript对象(引用类型)吗?

时间:2016-05-18 20:55:30

标签: javascript angularjs object

我有代码:

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

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

  return contract;
}

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

3 个答案:

答案 0 :(得分:2)

  

问题是 - Contract()的结果会怎样?

它过着自己的生活,不会受到Contract未来电话的影响。

  

每次使用= {}重新创建合同吗?

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

  

Contract()将是单身人士

不是单身人士。

  

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

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

的Singleton

有几种方法可以实现单例。一种方法是将第一个创建的实例作为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;
}

答案 1 :(得分:1)

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

答案 2 :(得分:1)

请尝试以下方法进行测试:

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}

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