Показать сообщение отдельно
  #3 (permalink)  
Старый 14.03.2012, 17:15
Новичок на форуме
Отправить личное сообщение для net.me.art Посмотреть профиль Найти все сообщения от net.me.art
 
Регистрация: 04.05.2011
Сообщений: 3

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

Так как мне поступить?)

Последний раз редактировалось net.me.art, 14.03.2012 в 19:01.
Ответить с цитированием