whole_func_string: function getDeepProperty(obj, keys) {
    var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
        _ref$throwError = _ref.throwError,
        throwError = _ref$throwError === undefined ? false : _ref$throwError,
        backup = _ref.backup;
  
    if (isString(keys)) {
      keys = keys.split('.');
    }
    if (!isArray(keys)) {
      throw new TypeError('keys of getDeepProperty must be string or Array<string>');
    }
    var read = [];
    var target = obj;
    for (var i = 0, len = keys.length; i < len; i++) {
      var key = keys[i];
      if (isVoid(target)) {
        if (throwError) {
          throw new Error('obj' + (read.length > 0 ? '.' + read.join('.') : ' itself') + ' is ' + target);
        } else {
          return backup;
        }
      }
      target = target[key];
      read.push(key);
    }
    return target;
  }
func_code_string: function getDeepProperty(obj, keys) {
    var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
        _ref$throwError = _ref.throwError,
        throwError = _ref$throwError === undefined ? false : _ref$throwError,
        backup = _ref.backup;
  
    if (isString(keys)) {
      keys = keys.split('.');
    }
    if (!isArray(keys)) {
      throw new TypeError('keys of getDeepProperty must be string or Array<string>');
    }
    var read = [];
    var target = obj;
    for (var i = 0, len = keys.length; i < len; i++) {
      var key = keys[i];
      if (isVoid(target)) {
        if (throwError) {
          throw new Error('obj' + (read.length > 0 ? '.' + read.join('.') : ' itself') + ' is ' + target);
        } else {
          return backup;
        }
      }
      target = target[key];
      read.push(key);
    }
    return target;
  }
func_documentation_string: get an deep property