function CremeElement(tagName, isVoid, attributes, children) {
  if (!(this instanceof CremeElement)) {
    return new CremeElement(tagName, isVoid, attributes, children);
  }

  /**
   * The tag name of the element.
   *
   * @type {string}
   * @protected
   */
  this._tagName = tagName;

  /**
   * Whether the element is a void element.
   *
   * Void elements are elements that cannot have children.
   *
   * @type {boolean}
   * @protected
   */
  this._isVoid = isVoid;

  /**
   * A unique identifier for the element instance that is used to identify the
   * element during patching.
   *
   * @type {string}
   * @protected
   */
  this._key = null;

  /**
   * A key-value map of the static properties of the element.
   *
   * Static properties do not change between renderings of the element.
   *
   * @type {Object}
   * @protected
   */
  this._static = null;

  /**
   * The attributes of the element.
   *
   * @type {Object}
   * @protected
   */
  this._attributes = attributes;

  /**
   * The computed properties of the element.
   *
   * Computed properties are calculated during render time.
   *
   * @type {Object.<string, function>}
   * @protected
   */
  this._computed = null;

  /**
   * Child elements of the element.
   *
   * @type {Array.<*>}
   * @protected
   */
  this._children = children;

  /**
   * The associated node with this element.
   *
   * @type {Element|Text}
   */
  this.node = null;

  this._init();
}
/**
 * CremeElement is an abstraction of an actual DOMNode.
 *
 * @constructor
 * @param {string} tagName The name of the tag.
 * @param {boolean} isVoid Whether the tag is a void element, i.e. cannot have
 *     any children.
 * @param {CremeElementAttributes} attributes The attributes of the instance.
 */
CremeElement is an abstraction of an actual DOMNode.
@constructor
@param {string} tagName The name of the tag.
@param {boolean} isVoid Whether the tag is a void element, i.e. cannot have
any children.
@param {CremeElementAttributes} attributes The attributes of the instance.
CremeElement is an abstraction of an actual DOMNode . @constructor @param { string } tagName The name of the tag . @param { boolean } isVoid Whether the tag is a void element i . e . cannot have any children . @param { CremeElementAttributes } attributes The attributes of the instance .
function CremeElement(tagName, isVoid, attributes, children) {
  if (!(this instanceof CremeElement)) {
    return new CremeElement(tagName, isVoid, attributes, children);
  }
  this._tagName = tagName;
  this._isVoid = isVoid;
  this._key = null;
  this._static = null;
  this._attributes = attributes;
  this._computed = null;
  this._children = children;
  this.node = null;
  this._init();
}
function CremeElement ( tagName , isVoid , attributes , children ) { if ( ! ( this instanceof CremeElement ) ) { return new CremeElement ( tagName , isVoid , attributes , children ) ; } this . _tagName = tagName ; this . _isVoid = isVoid ; this . _key = null ; this . _static = null ; this . _attributes = attributes ; this . _computed = null ; this . _children = children ; this . node = null ; this . _init ( ) ; }
CremeElement is an abstraction of an actual DOMNode.
CremeElement is an abstraction of an actual DOMNode .
/**
   * The tag name of the element.
   *
   * @type {string}
   * @protected
   */ /**
   * Whether the element is a void element.
   *
   * Void elements are elements that cannot have children.
   *
   * @type {boolean}
   * @protected
   */ /**
   * A unique identifier for the element instance that is used to identify the
   * element during patching.
   *
   * @type {string}
   * @protected
   */ /**
   * A key-value map of the static properties of the element.
   *
   * Static properties do not change between renderings of the element.
   *
   * @type {Object}
   * @protected
   */ /**
   * The attributes of the element.
   *
   * @type {Object}
   * @protected
   */ /**
   * The computed properties of the element.
   *
   * Computed properties are calculated during render time.
   *
   * @type {Object.<string, function>}
   * @protected
   */ /**
   * Child elements of the element.
   *
   * @type {Array.<*>}
   * @protected
   */ /**
   * The associated node with this element.
   *
   * @type {Element|Text}
   */