Показать сообщение отдельно
  #1 (permalink)  
Старый 11.09.2013, 23:35
Аватар для Murdoc
Аспирант
Отправить личное сообщение для Murdoc Посмотреть профиль Найти все сообщения от Murdoc
 
Регистрация: 04.05.2013
Сообщений: 45

Наследование прототипов
Шаблон фабрика(фабричный метод) создает объекты в зависимости от контекста.

Помимо создания нужно унаследовать как прототип фабрики, так и прототип используемого конструктора.

Как это грамотно реализовать?

Код:

define(['TankModel', 'ShipModel'], function (Tank, Ship) {
  // Factory GameModel
  function GameModel() {}

  // общие методы, которые наследуются всеми
  GameModel.prototype.getType = function () {
     console.log('this getType');
  };

  // фабричный метод
  // type - тип конструктора
  // params - данные для конструктора
  GameModel.factory = function (type, params) {
    var object;

    // вывести ошибку, если конструктор
    // для запрошенного типа отсутствует
    if (typeof GameModel[type] !== 'function') {
      throw {
        name: 'Error',
        message: type + ' не существует'
      }
    }

    // тут нужно унаследовать содержимое фабричного прототипа
    // делать это каждый раз при использовании одних и тех же конструкторов не нужно
    if (typeof GameModel[type].prototype.getType !== 'function') {
      GameModel[type].prototype = new GameModel();
    }

    // тут возвращается объект от конструктора [type]
    object = new GameModel[type]();

    // работа с готовым объектом:

    // это метод конструктора
    object.initialize(params);
    // это метод фабрики
    object.getType();

    return object;
  };

  // делает танки
  GameModel.tank = Tank;

  // делает корабли
  GameModel.ship = Ship;

  return GameModel;
});



Создание объекта:

var tank = GameModel.factory('tank');
var ship = GameModel.factory('ship');





Эта фабрика не работает. Фабричные методы затираются при вызове конструктора

Последний раз редактировалось Murdoc, 11.09.2013 в 23:40.
Ответить с цитированием