function TreeNode(tree, source, excludeKeys) {
      var _this = this;
      _classCallCheck(this, TreeNode);
      Object.defineProperty(this, '_tree', {
        value: tree,
        writable: true
      });
      if (source instanceof TreeNode) {
        excludeKeys = castArray(excludeKeys);
        excludeKeys.push('_tree');

        // Iterate manually for better perf
        each(source, function (value, key) {
          // Skip properties
          if (!includes(excludeKeys, key)) {
            if (isObject(value)) {
              if (value instanceof TreeNodes) {
                _this[key] = value.clone();
              } else if (key === 'itree') {
                _this[key] = cloneItree(value);
              } else {
                _this[key] = cloneDeep(value);
              }
            } else {
              // Copy primitives
              _this[key] = value;
            }
          }
        });
      }
    }
Represents a singe node object within the tree.

@param {TreeNode} source TreeNode to copy.
@return {TreeNode} Tree node object.