Расширить конструктор дополнительными данными
Есть фабрика, в которую добавляются конструкторы:
(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)); Необходимо сделать такой функционал, который будет добавлять в один из конструкторов данные, которые будут использоваться при работе с объектом, созданным этим конструктором. Данные должны быть динамическими (могли меняться). То есть функциональность объектов, созданных конструктором может отличаться Как бы вы это сделали? |
|
нет, не то! Там изменяется объект, а мне нужно изменять конструктор
|
То есть расширить Factory[name] параметрами, к которым можно будет обратиться из объекта и которые не затрут внутренние параметры объекта
|
dmitry111, тебе нужно добавить в Factory[name] определенные свойство в зависимости от объекта?
Если да, то как отличаются объекты? Как ты отличаешь какие свойства добавить? |
Цитата:
не в зависимости от объекта! Грубо говоря Factory[name]['foo'] = 'bar' - вполне рабочий вариант. Factory[name]['foo'] = 'bar'; var x = Factory(name); console.log(x.constructor.foo) Сама реализация не нравится |
dmitry111, угу, но зачем это почему не создать базовые классы и не унаследовать методы?
|
Цитата:
var obj = Factory(type, data); тоже не вариант!) Нужно сделать именно дополнительный динамический функционал для конструктора |
Цитата:
|
Цитата:
Так вот эти параметры нужно подгружать и инициализировать в конструкторе при каждой смене карты. Хранить их в самом конструкторе бессмысленно (карты разные), передавать их при создании объекта тоже не катит, потому как карта имеет динамические элементы, которые должны создаваться конструктором в любой момент игры, а так как создают их низкоуровневый код, то ему все равно что создать - что пулю, что ящик в игре.. он просто получает координаты и имя модели |
Цитата:
|
Цитата:
Я не вижу всей картины но сейчас это выглядит так что ты через пару месяцев будешь это все проклинать) Мне кажется хорошей идеей будет сами игровые объекты разделить на классы, а карту держать в объекте. |
Цитата:
|
Цитата:
function Bullet() {} function Soldier() {} Factory.add({ 'Bullet': Bullet, 'Soldier': Soldier }) |
51 строка должна быть
var soldier = Factory('Soldier', 'Vasya'); |
Цитата:
|
Цитата:
изначально карта отрисовывалась из тайлов и общая картинка карты не изменялась Все данные для карты передавались при инициализации (то есть только один раз). Теперь же, с появлением динамических элементов появилась необходимось создавать небольшие "куски" карты после инициализации, которые могли участвовать в игре - динамические. Например ящик, который можно будет подвинуть. Для них и нужны эти данные. |
Rise, наследовать не удобно потому как конструкторы грузятся все и сразу и не имеют строгих имен. Я могу опознать конструктор карт в момент инициализации карты. Мне приходит название конструктора и данные, по ним я и ориентируюсь
|
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]; }; |
Rise,
спасибо! а как добавить свойства не создавая экземпляр? |
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 |
Rise,
да, вроде то что надо. Спасибо! |
Часовой пояс GMT +3, время: 12:33. |