У меня есть код:
function Contract() {
var contract = {};
contract.id = ...;
contract.date = ...;
contract.calculateTotal = function() {
...
}
return contract;
}
Вопрос в том, что происходит с результатом контракта()? Контракт каждый раз создается заново с помощью = {}? Эта проблема связана с дизайном слоя модели AngularJS. Контракт() должен использоваться как конструктор для создания новых объектов уровня модели. Контракт() будет одинарным, а реальный вопрос - каждый вызов Контракта() создает новый объект или есть один контрактный объект, который находится внутри singelton Contract(), и тот же экземпляр возвращается при каждом вызове Контракта()?
Вопрос в том, что происходит с результатом контракта()?
Он живет своей жизнью и не затрагивается будущими призывами к 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;
}
Каждый раз, когда вы вызываете функцию Contract()
, она создает новый пустой объект и назначает ему contract
а затем возвращает его из функции. Итак, да, новый экземпляр объекта возвращается для каждого вызова вашей функции, и да, он возвращается ссылкой, поэтому возвращаемый экземпляр - тот, который создан и назначен для contract
в вашей функции.
Попробуйте следующее:
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}
Очевидно, что новый объект создается каждый раз, когда вы вызываете контракт.