code: function(attrs, options = {}) {
          var error;
  
          var mobilePhoneNumber =
            (attrs && attrs.mobilePhoneNumber) || this.get('mobilePhoneNumber');
          if (!mobilePhoneNumber || mobilePhoneNumber === '') {
            error = new AVError(
              AVError.OTHER_CAUSE,
              'Cannot sign up or login user by mobilePhoneNumber ' +
                'with an empty mobilePhoneNumber.'
            );
            throw error;
          }
  
          var smsCode = (attrs && attrs.smsCode) || this.get('smsCode');
          if (!smsCode || smsCode === '') {
            error = new AVError(
              AVError.OTHER_CAUSE,
              'Cannot sign up or login user by mobilePhoneNumber  ' +
                'with an empty smsCode.'
            );
            throw error;
          }
  
          options._makeRequest = function(route, className, id, method, json) {
            return AVRequest('usersByMobilePhone', null, null, 'POST', json);
          };
          return this.save(attrs, options).then(function(model) {
            delete model.attributes.smsCode;
            delete model._serverData.smsCode;
            return model._handleSaveResult(true).then(function() {
              return model;
            });
          });
        }
docs: Signs up a new user with mobile phone and sms code.
  You should call this instead of save for
  new AV.Users. This will create a new AV.User on the server, and
  also persist the session on disk so that you can access the user using
  <code>current</code>.
  
  <p>A username and password must be set before calling signUp.</p>
  
  @param {Object} attrs Extra fields to set on the new user, or null.
  @param {AuthOptions} options
  @return {Promise} A promise that is fulfilled when the signup
  finishes.
  @see AV.User.signUpOrlogInWithMobilePhone
  @see AV.Cloud.requestSmsCode