extend: new() инстанциированного объекта
Как в a.instance() получить new b() ?
Цель: избавиться от кучи повторяющегося кода; вынести в instance общие инициализаторы и настройки объектов. Пример кода (extend взят отсюда): var a = function(){}; a.prototype.instance = function(){ return ??? }; var b = function(){}; extend(b,a); var c = new b(); Или в моем случае более уместным будет использование mixin ? P.S. Рассмотрю и другие техники решающие мою задачу. Заранее благодарен. |
если я правильно Вас понял
function construct( x, y ) { this.x = x; this.y = y; } construct.prototype.sum = function() { return this.x + this.y; } var obj = new construct( 1, 2 ); alert( [ obj.x, obj.y ].join( '\n' ) ); alert( obj.sum() ); |
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 :) Так как мне поступить?) |
Вы имеете в виду наследование из множества источников?
|
Часовой пояс GMT +3, время: 01:55. |