create-class.js

function setProps (properties = {}, options = {}) {
  for (const key in properties) {
    this[key] = properties[key]
  }
  for (const key in options) {
    this[key] = options[key]
  }
}

/**
 * Creates a dynamic class and optionally extends a parent class.
 *
 * @param {string} className Class name hint.
 * @param {Object} [properties={}] Default properties assigned to instances.
 * @param {Function} [parent] Parent class to extend.
 * @returns {Function} Generated class constructor.
 */
function createClass (className, properties = {}, parent) {
  let cls = class {
    constructor (...options) {
      setProps.call(this, properties, ...options)
    }
  }
  if (parent) {
    cls = class extends parent {
      constructor (options) {
        super(options)
        setProps.call(this, properties, options)
      }
    }
  }
  return cls
}

export default createClass