Объект JavaScript (ссылочный тип) возвращается по ссылке?

0

У меня есть код:

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

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

  return contract;
}

Вопрос в том, что происходит с результатом контракта()? Контракт каждый раз создается заново с помощью = {}? Эта проблема связана с дизайном слоя модели AngularJS. Контракт() должен использоваться как конструктор для создания новых объектов уровня модели. Контракт() будет одинарным, а реальный вопрос - каждый вызов Контракта() создает новый объект или есть один контрактный объект, который находится внутри singelton Contract(), и тот же экземпляр возвращается при каждом вызове Контракта()?

  • 1
    это легко проверить
Показать ещё 2 комментария
Теги:
object

3 ответа

2
Лучший ответ

Вопрос в том, что происходит с результатом контракта()?

Он живет своей жизнью и не затрагивается будущими призывами к Contract.

Контракт каждый раз создается заново с помощью = {}?

Да, каждый раз, когда вы вызываете функцию, оператор var создает новую переменную.

Контракт() будет singleton

Это не одноэлементный.

и реальный вопрос: если каждый вызов Contract() создает новый объект или есть один контрактный объект, который находится внутри singelton 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;
}
1

Каждый раз, когда вы вызываете функцию Contract(), она создает новый пустой объект и назначает ему contract а затем возвращает его из функции. Итак, да, новый экземпляр объекта возвращается для каждого вызова вашей функции, и да, он возвращается ссылкой, поэтому возвращаемый экземпляр - тот, который создан и назначен для contract в вашей функции.

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}

Очевидно, что новый объект создается каждый раз, когда вы вызываете контракт.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню