Расширить конструктор дополнительными данными
Есть фабрика, в которую добавляются конструкторы:
(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, время: 20:13. |