applyDefaults (target) {
    if (!target) {
      return
    }
    const properties = this.properties || {}
    const hasSet = utils.isFunction(target.set) || utils.isFunction(target._set)
    utils.forOwn(properties, function (schema, prop) {
      if (Object.hasOwnProperty.call(schema, 'default') && utils.get(target, prop) === undefined) {
        if (hasSet) {
          target.set(prop, utils.plainCopy(schema.default), { silent: true })
        } else {
          utils.set(target, prop, utils.plainCopy(schema.default))
        }
      }
      if (schema.type === 'object' && schema.properties) {
        if (hasSet) {
          const orig = target._get('noValidate')
          target._set('noValidate', true)
          utils.set(target, prop, utils.get(target, prop) || {}, { silent: true })
          target._set('noValidate', orig)
        } else {
          utils.set(target, prop, utils.get(target, prop) || {})
        }
        schema.applyDefaults(utils.get(target, prop))
      }
    })
  }
Apply default values to the target object for missing values.

@name Schema#applyDefaults
@method
@param {object} target The target to which to apply values for missing values.