function initObjectClone(object, isDeep) {
      if (!isCloneable(object)) {
        return null;
      }
      var Ctor = object.constructor,
          className = toString.call(object),
          isArgs = className == argsClass || (!lodash.support.argsClass && isArguments(object)),
          isObj = className == objectClass;

      if (isObj && !(typeof Ctor == 'function' && Ctor instanceof Ctor)) {
        Ctor = Object;
      }
      if (isArgs || isObj) {
        var result = isDeep ? new Ctor : baseAssign(new Ctor, object);
        if (isArgs) {
          result.length = object.length;
        }
        return result;
      }
      switch (className) {
        case arrayBufferClass:
          return bufferClone(object);

        case boolClass:
        case dateClass:
          return new Ctor(+object);

        case float32Class: case float64Class:
        case int8Class: case int16Class: case int32Class:
        case uint8Class: case uint8ClampedClass: case uint16Class: case uint32Class:
          // Safari 5 mobile incorrectly has `Object` as the constructor
          if (Ctor instanceof Ctor) {
            Ctor = ctorByClass[className];
          }
          var buffer = object.buffer;
          return new Ctor(isDeep ? bufferClone(buffer) : buffer, object.byteOffset, object.length);

        case numberClass:
        case stringClass:
          return new Ctor(object);

        case regexpClass:
          result = new Ctor(object.source, reFlags.exec(object));
          result.lastIndex = object.lastIndex;
      }
      return result;
    }
Initializes an object clone.

@private
@param {Object} object The object to clone.
@param {boolean} [isDeep=false] Specify a deep clone.
@returns {null|Object} Returns the initialized object clone.