Не очень удачно по моему.
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(){}}