Заводы Javascript: состав - PullRequest
       8

Заводы Javascript: состав

0 голосов
/ 06 февраля 2019

У меня есть фабричная функция ( objectFactory ), и я хочу повторно использовать другие фабрики (например, наблюдаемые).

  1. Что не так с показанным дизайном?
  2. Как составить с фабрикой, которая работает с $ 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);
  }
}
...