extend(A, B);
Меня интересует именно создание объекта
A (
new(A)) внутри метода объекта
B. Если это вообще правильная практика, поступать так.
Немного истории
Задача стоящая перед мной - уменьшить дублирование кода. В рамках архитектуры приложения мне все равно какой паттерн используется в объекте, singleton, fabric или другой. Я обращаюсь к mod.instance() и в ответе получаю объект с которым я буду работать в стороннем коде. Но данный подход оказался беспощадным к размеру приложения (приходилось дублировать множество одинаковых методов). Разумным шагом было использование наследования.
На определенном этапе разработки встал вопрос о новом слое абстракции (наследования), в который будут вынесены такие методы, как
instance().
И появилась задача, изображу ее на примере:
// Объект от которого наследуются другие
var Component = function(){};
Component.prototype.init = function(){...};
...
Component.prototype.instance = function (params){
return ???;
// здесь нужно вернуть new modA/modZ(params)
// или function modA/modB со всеми его собственными методами (прототипа), что бы делать new во внешнем коде
}
// Разные наследованные объекты
// A
var modA = function(params){}
modA.prototype.superCoolFeature = function(){ /* yeahh!)) */ };
extend(modA, Component); // или mixin, или.. ?
// Z
var modZ = function(params){}
modZ.prototype.someOther = function(){ /*...*/ };
extend(modZ, Component); // или mixin, или.. ?
// Сторонний код
var myMod = modA.instance(); // A
myMod.superCoolFeature();
var otherMod = modZ.instance(); // Z
otherMod.someOther();
Фишка в том, что
instance() реализует сам паттерн, будь то одиночка, фабрика или другой, а так же дополнительную работу над объектом, например, проверки/присваивания/вызовы. На выходе мне нужно получить объект
mod, с методами
Component для прозрачного использования в стороннем коде. Причем (!) т.к. процесс "инициализации"
modA и
modZ идентичен, то хочется его вынести в
Component, что бы не плодить этот код в каждом объекте основанном на
Component'e (а таких множество).
Все остальные повторяющиеся методы, понятно, уже в Component
Так как мне поступить?)