У меня есть фабричная функция ( objectFactory ), и я хочу повторно использовать другие фабрики (например, наблюдаемые).
- Что не так с показанным дизайном?
- Как составить с фабрикой, которая работает с $ value (например, чтобы добавить метод, который увеличивает инкапсулированный $ value
*.inc(1)
)?
const pipe = (...fns) => x => fns.reduce( (prev, func) => func(prev), x);
const compose = (...fn) => obj => pipe(...fn)(obj);
const freeze = o => Object.freeze(o);
const observable = o => {
const observers = {};
const keys = () => Object.getOwnPropertySymbols(observers).map(k => observers[k]);
return {
...o,
subscribe(obj) {
const id = Symbol();
observers[id] = obj;
return { id: id, unsubscribe: this.unsubscribe.bind(this, id) };
},
unsubscribe(id) {
delete observers[id];
},
notify(value) {
keys().forEach(obj => obj.update(value));
}
};
};
const loggable = text => o => {
return {
...o,
log: (...args) => { console.log(text, ...args); }
};
};
// This is the factory
function objectFactory(value, name = 'my factory') {
var $value = value;
return compose(
observable,
loggable(name),
freeze)({
get: () => $value,
set: set
});
function set(val) {
$value = val;
this.log('log the set value', $value);
this.notify($value);
}
}