Показать сообщение отдельно
  #3 (permalink)  
Старый 13.09.2013, 14:39
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Не очень удачно по моему.
object = new GameModel[type](GameModel.prototype);
object.initialize(params);

Как то странно подмешиваемые методы передавать как параметр конструктору, а инициализацию дергать потом отдельно. По крайней мере здесь причин для этого я не вижу.


Вроде вот так как то по привычнее будет.
define(['TankModel', 'ShipModel'], function (Tank, Ship) {

    function GameModel( type, params){   
       //Проверка на наличие конструктора
       if (typeof GameModel[type] !== 'function') {
           throw {
               name: 'Error',
               message: type + ' не существует'
           }
        }

        var instance=new GameModel[type](params);

        //если нужно то можно подмешать методы фабрики        
        instance.getType=GameModel.prototype.getType;

        return instance;
    }

    //Перечислим продукты которая может создавать фабрика
    GameModel.Ship=Ship;
    GameModel.Tank=Tank;
    

    //методы которые можно подмешивать
    GameMode.prototype.getType=function(){
       //бла бла
    }    
});


Или может быть даже так
Добавим подмешиваемые методы сразу в прототип.

define(['TankModel', 'ShipModel'], function (Tank, Ship) {

    function GameModel( type, params){   
       //Проверка на наличие конструктора
       if (typeof GameModel[type] !== 'function') {
           throw {
               name: 'Error',
               message: type + ' не существует'
           }
        } 

        return new GameModel[type](params);
    }

    //метод для добавления новых продуктов к фабрике
    GameModel.add=function(name,obj){
        //примеси
        obj.prototype.getType=GameModel.prototype.getType;
        GameModel[name]=obj;
    }

    //Перечислим продукты которая может создавать фабрика
    GameModel.add('Ship',Ship);
    GameModel.add('Tank',Tank);
    
    //методы которые можно подмешивать
    GameModel.prototype.getType=function(){
       //бла бла
    }    
});


Последний вариант это собрать все примеси в одном специализированном объекте, но так чтобы они могли работать с экземпляром. Первый приходящий на ум способ сделать это не вмешиваясь в работу конструктора, просто сохранить ссылку на экземпляр в замыкании.

define(['TankModel', 'ShipModel'], function (Tank, Ship) {

    function GameModel( type, params){   
       //Проверка на наличие конструктора
       if (typeof GameModel[type] !== 'function') {
           throw {
               name: 'Error',
               message: type + ' не существует'
           }
        } 

        var instance=new GameModel[type](params);
        instance.GameModel=Inclusions(instance);
        return instance
    }

    //набор включений которые добавляются фабрикой в экземпляр
    function Inclusions(obj) {
        return {
            getType:function(){
                 return typeof obj;
            }
        }
    }   

});

//вместо 
instance.GameModel=Inclusions();
//хватило бы и
instance.GameModel={f1:function(){}, f2:function(){}}
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 14.09.2013 в 21:47.
Ответить с цитированием