На сайте dojo есть
статья про цилические ссылки. В ней говорится, что циклические ссылки в модулях разрешаются путем введения специального идентификатора модуля "exports". Когда модуль инстанцируется, мы в соответствующей переменной exports в фабрике модуля получаем ссылку на пока пустой объект, который далее будет использоваться как значение модуля. И все свойства и методы модуля мы устанавливаем в этот пустой объект exports, а не создаем новый и возвращаем его. С этим все понятно. До тех пор пока у нас значением модуля является синглетон-объект.
А как быть в случае, когда в качестве значения модуля выступает конструктор класса?
К примеру у нас есть следующие модули, которые возвращают конструкторы, а не синглетон-объекты:
// in "my/moduleA.js"
define([ "dojo/_base/declare", "./moduleB" ], function(declare, ModuleB){
return declare("A", null, {
consctructor: function(){
// dependency on ModuleB
this.moduleB = new ModuleB();
}
getValue: function(){
return "oranges";
},
print: function(){
log(this.moduleB.getValue());
}
});
});
// in "my/moduleB.js"
define([ "dojo/_base/declare", "./moduleA" ], function(declare, ModuleA){
return declare("B", null, {
constructor: function(){
// dependency on ModuleA
this.moduleA = new ModuleA();
}
getValue: function(){
return "apples and " + this.moduleA.getValue();
}
});
});
// in "index.html"
require([
"my/moduleA"
], function(ModuleA) {
var moduleA = new ModuleA();
moduleA.print();
});
Если бы не было циклических ссылок, то все было бы нормально. Когда появляется циклическая ссылка, мы должны в модуль moduleA добавить exports, и настраивать именно его как значение модуля. Но нам ведь в качестве значения модуля нужен конструктор объектов, а не синглетон-объект, каким будет являться exports. Вот именно в этом и заключается моя проблема. Подскажите, есть ли решение и какое?
Сейчас я сделал следующим образом:
// in "my/moduleA.js"
define([ "dojo/_base/declare", "./moduleB", "exports" ], function(declare, ModuleB, exports){
var A = declare("A", null, {
consctructor: function(){
// dependency on ModuleB
this.moduleB = new ModuleB();
}
getValue: function(){
return "oranges";
},
print: function(){
log(this.moduleB.getValue());
}
});
exports.newInstance = function() {
return new A();
}
});
// in "index.html"
require([
"my/moduleA"
], function(ModuleA) {
//тут ModuleA является фабрикой объектов, а не конструктором
var moduleA = ModuleA.newInstance();
moduleA.print();
});
т.е. модуль A возвращает мне не конструктор A, а синглетон-объект, который является фабрикой объектов A. Такой подход работает, и, в принципе, я могу оставить и его. Но хотелось бы узнать, если способ вернуть в качестве значения такого модуля конструктор объектов?