TL; ДР:
Нужны ли нам фабрики/конструкторы в прототипическом OO? Можем ли мы сделать переключатель парадигмы и полностью отказаться от них?
BackStory:
В последнее время я занимался разработкой прототипического OO в JavaScript и обнаружил, что 99% OO, выполненного в JavaScript, заставляют в него классические OO-шаблоны.
Мое взятие прототипического ОО состоит в том, что оно включает в себя две вещи. Статический прототип методов (и статических данных) и привязка данных. Нам не нужны фабрики или конструкторы.
В JavaScript это объектные литералы, содержащие функции и Object.create
.
Это означало бы, что мы можем моделировать все как статическую схему/прототип и абстракцию привязки данных, которая предпочтительно подключается прямо к базе данных в стиле документа. То есть объекты извлекаются из базы данных и создаются путем клонирования прототипа с данными. Это означало бы, что нет логики конструктора, нет фабрик, нет new
.
Пример кода:
Псевдо пример:
var Entity = Object.create(EventEmitter, {
addComponent: {
value: function _addComponent(component) {
if (this[component.type] !== undefined) {
this.removeComponent(this[component.type]);
}
_.each(_.functions(component), (function _bind(f) {
component[f] = component[f].bind(this);
}).bind(this));
component.bindEvents();
Object.defineProperty(this, component.type, {
value: component,
configurable: true
});
this.emit("component:add", this, component);
}
},
removeComponent: {
value: function _removeComponent(component) {
component = component.type || component;
delete this[component];
this.emit("component:remove", this, component);
}
}
}
var entity = Object.create(Entity, toProperties(jsonStore.get(id)))
Небольшое объяснение:
Конкретный код является подробным, поскольку ES5 является подробным. Entity
выше - проект/прототип. Любой фактический объект с данными будет создан с помощью Object.create(Entity, {...})
.
Фактические данные (в этом случае компоненты) непосредственно загружаются из магазина JSON и вводятся непосредственно в вызов Object.create
. Конечно, аналогичная модель применяется для создания компонентов, и только базы данных, которые проходят Object.hasOwnProperty
, хранятся в базе данных.
Когда объект создается впервые, он создается с пустым {}
Актуальные вопросы:
Теперь мои актуальные вопросы
- Примеры с открытым исходным кодом прототипического ОО JS?
- Это хорошая идея?
- Согласован ли он с идеями и концепциями прототипического ООП?
- Не будет ли использовать какие-либо конструкторы / factory функции где-нибудь укусить меня? Можем ли мы действительно уйти от использования конструкторов. Существуют ли какие-либо ограничения с использованием вышеуказанной методологии, где нам нужны фабрики для их преодоления.