Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Расширить конструктор дополнительными данными (https://javascript.ru/forum/offtopic/57414-rasshirit-konstruktor-dopolnitelnymi-dannymi.html)

dmitry111 02.08.2015 22:19

Расширить конструктор дополнительными данными
 
Есть фабрика, в которую добавляются конструкторы:

(function () {
  var root = this;

  // Фабрика для строительства объектов игры
  // создает объект игры указанного типа
  // по заданным параметрам
  function Factory(type, params) {
    if (typeof Factory[type] !== 'function') {
      return;
    }

    return new Factory[type](params);
  }

  // добавление конструкторов
  Factory.add = function (data) {
    var name;

    for (name in data) {
      if (data.hasOwnProperty(name)) {
        Factory[name] = data[name];
      }
    }
  };

  if (typeof exports !== 'undefined') {
    if (typeof module !== 'undefined' && module.exports) {
      exports = module.exports = Factory;
    }
    exports.Factory = Factory;
  } else {
    if (typeof define === 'function' && define.amd) {
      define('Factory', [], function () {
        return Factory;
      });
    } else {
      root.Factory = Factory;
    }
  }
}.call(this));


Необходимо сделать такой функционал, который будет добавлять в один из конструкторов данные, которые будут использоваться при работе с объектом, созданным этим конструктором.

Данные должны быть динамическими (могли меняться). То есть функциональность объектов, созданных конструктором может отличаться


Как бы вы это сделали?

cyber 03.08.2015 00:24

http://www.dofactory.com/javascript/...design-pattern может так?

dmitry111 03.08.2015 10:29

нет, не то! Там изменяется объект, а мне нужно изменять конструктор

dmitry111 03.08.2015 10:35

То есть расширить Factory[name] параметрами, к которым можно будет обратиться из объекта и которые не затрут внутренние параметры объекта

cyber 03.08.2015 10:37

dmitry111, тебе нужно добавить в Factory[name] определенные свойство в зависимости от объекта?
Если да, то как отличаются объекты?
Как ты отличаешь какие свойства добавить?

dmitry111 03.08.2015 15:56

Цитата:

Сообщение от cyber
dmitry111, тебе нужно добавить в Factory[name] определенные свойство в зависимости от объекта?
Если да, то как отличаются объекты?
Как ты отличаешь какие свойства добавить?


не в зависимости от объекта!
Грубо говоря Factory[name]['foo'] = 'bar' - вполне рабочий вариант.
Factory[name]['foo'] = 'bar';

var x = Factory(name);

console.log(x.constructor.foo)



Сама реализация не нравится

cyber 03.08.2015 18:14

dmitry111, угу, но зачем это почему не создать базовые классы и не унаследовать методы?

dmitry111 03.08.2015 20:57

Цитата:

Сообщение от cyber
dmitry111, угу, но зачем это почему не создать базовые классы и не унаследовать методы?

не вариант! Это не должно выглядеть как наследование. К конструктуру наследуются не методы, а свойства. Вариант передавать их в момент создания объекта:

var obj = Factory(type, data);


тоже не вариант!)



Нужно сделать именно дополнительный динамический функционал для конструктора

cyber 03.08.2015 21:02

Цитата:

Сообщение от dmitry111
Нужно сделать именно дополнительный динамический функционал для конструктора

Зачем? Опиши полностью ситуацию я не до конца понимаю что ты хочешь и зачем?

dmitry111 03.08.2015 21:16

Цитата:

Сообщение от cyber
Зачем? Опиши полностью ситуацию я не до конца понимаю что ты хочешь и зачем?

Ок! Есть 2d мультиплеерная игра. В ней вся графика работает на конструкторах. Один конструктор создает пулю, другой игрока. Карты в игре тоже формируются из конструктора. Карт много, они разные и создаются из разных исходников и параметров

Так вот эти параметры нужно подгружать и инициализировать в конструкторе при каждой смене карты. Хранить их в самом конструкторе бессмысленно (карты разные), передавать их при создании объекта тоже не катит, потому как карта имеет динамические элементы, которые должны создаваться конструктором в любой момент игры, а так как создают их низкоуровневый код, то ему все равно что создать - что пулю, что ящик в игре.. он просто получает координаты и имя модели

dmitry111 03.08.2015 21:23

Цитата:

Сообщение от Rise
dmitry111, почему ты не так объект создаешь, а пишешь через new, в 7-й строке функция для чего тебе тогда?

это фабрика конструкторов

cyber 03.08.2015 21:37

Цитата:

Сообщение от dmitry111
Так вот эти параметры нужно подгружать и инициализировать в конструкторе при каждой смене карты. Хранить их в самом конструкторе бессмысленно (карты разные), передавать их при создании объекта тоже не катит, потому как карта имеет динамические элементы, которые должны создаваться конструктором в любой момент игры, а так как создают их низкоуровневый код, то ему все равно что создать - что пулю, что ящик в игре.. он просто получает координаты и имя модели

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

dmitry111 03.08.2015 22:58

Цитата:

Сообщение от cyber (Сообщение 382635)
Мне кажется ты стреляешь себе в ногу с дробовика )
Я не вижу всей картины но сейчас это выглядит так что ты через пару месяцев будешь это все проклинать)
Мне кажется хорошей идеей будет сами игровые объекты разделить на классы, а карту держать в объекте.

да нет, все нормально функционирует. Проблема возникла с внедрением динамических элементов карты.

dmitry111 03.08.2015 22:59

Цитата:

Сообщение от Rise
dmitry111, покажи пример как ты добавляешь конструктор, т.е. в Factory.add(data) data что представляет из себя.

а в чем возникла проблема?

function Bullet() {}
function Soldier() {}


Factory.add({
  'Bullet': Bullet,
  'Soldier': Soldier
})

dmitry111 04.08.2015 07:41

51 строка должна быть

var soldier = Factory('Soldier', 'Vasya');

dmitry111 04.08.2015 09:08

Цитата:

Сообщение от Rise (Сообщение 382667)
см. пост 11

да я там выше ошибся. поправил

dmitry111 04.08.2015 11:23

Цитата:

Сообщение от Rise
Не понятно про "динамические элементы", пример приведи конструктора карты с такими элементами и как они там проявляют свою динамичность.


изначально карта отрисовывалась из тайлов и общая картинка карты не изменялась Все данные для карты передавались при инициализации (то есть только один раз).

Теперь же, с появлением динамических элементов появилась необходимось создавать небольшие "куски" карты после инициализации, которые могли участвовать в игре - динамические. Например ящик, который можно будет подвинуть. Для них и нужны эти данные.

dmitry111 05.08.2015 09:13

Rise, наследовать не удобно потому как конструкторы грузятся все и сразу и не имеют строгих имен. Я могу опознать конструктор карт в момент инициализации карты. Мне приходит название конструктора и данные, по ним я и ориентируюсь

Rise 05.08.2015 22:06

dmitry111,
Factory[name] = data[name];
Factory[name].prototype.data = function (name, value) {
  var constr = this.constructor;
  if (value !== undefined) constr[name] = value;
  return constr[name];
};

dmitry111 06.08.2015 15:31

Rise,

спасибо!

а как добавить свойства не создавая экземпляр?

Rise 06.08.2015 23:54

dmitry111, так например:
Factory.add = function (data) {
	var name, constr, link = this.data;
	for (name in data) {
		if (data.hasOwnProperty(name)) {
			constr = this[name] = data[name];
			constr.data = constr.prototype.data = link;
		}
	}
};
Factory.data = function (name, value) {
	var constr = (typeof this !== 'function') ? this.constructor : this;
	return (value !== undefined) ? constr[name] = value : constr[name];
};
// (Constructor|Instance).data(name) get the constructor's name value
// (Constructor|Instance).data(name, value) set the constructor's name value and return it

dmitry111 07.08.2015 23:26

Rise,

да, вроде то что надо. Спасибо!


Часовой пояс GMT +3, время: 12:33.