Javascript OO вопрос - PullRequest
       8

Javascript OO вопрос

0 голосов
/ 22 февраля 2009

Итак, я хочу построить класс / объект проверки формы в javascript. То, как я это вижу, будет примерно таким:

var form=new Validation(); 
form.addField("name","Your name","required");
form.addField("email","Email Address","is_email");
.........
form.validate(); 

Я думал, что класс validation будет определен примерно так?

validation
{
  var fields=new Array();
  var labels=new Array();
  var rules=new Array();
  var count=0;

  function addField(field,label,rule)
  {
    this.fields[count]=field;
    this.labels[count]=label;
    this.rules[count]=rule;
    this.count=count+1;
  }

  function validate()
  {
    var valid;
    for (x=0; x< count; x++)
    {
      valid=false;
      switch (this.rules[x])
      {
         case 'required':
           valid=this.validate_required(this.fields[x]);
           break;

         case 'email':
           valid=this.validate_email(this.fields[x]);
           break;
       }

       if (! valid)
         this.addError(this.fields[x],this.rules[x],this.labels[x]);
     }

     if (this.hasErrors())
       return false;  
     else
       return true;
   }

..........
}

Я знаю, что это, вероятно, невозможно, как сейчас. У меня вопрос: что я могу сделать, чтобы первый блок кода (который создает новый экземпляр Validation и добавляет к нему правила) работал?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 22 февраля 2009

Вы просто пропускаете некоторые обозначения OO. Строки, помеченные "// ***" комментарием, - это те, которые я изменил из исходного кода:

function Validation() // ***
{
  var fields=new Array();
  var labels=new Array();
  var rules=new Array();
  var count=0;

  this.addField = function (field,label,rule) // ***
  {
    fields[count]=field; // ***
    labels[count]=label; // ***
    rules[count]=rule;   // ***
    count=count+1;
  }

  this.validate = function () // ***
  {
    var valid;
    for (x=0; x< count; x++)
    {
      valid=false;
      switch (rules[x]) // ***
      {
         case 'required':
           valid=this.validate_required(fields[x]); // ***
           break;

         case 'email':
           valid=this.validate_email(fields[x]); // ***
           break;
       }

       if (! valid)
         this.addError(fields[x],rules[x],labels[x]); // ***
     }

     if (this.hasErrors())
       return false;  
     else
       return true;
   }
}

О, и я не видел validate_required(), validate_email(), addError() или hasErrors(). Могу добавить их.

0 голосов
/ 22 февраля 2009

Javascript - это основанный на прототипах язык программирования. Так что не существует истинного способа иметь классы. Способ создания классов (или имитации его) заключается в использовании функции, в которой есть состояние и больше функций, охватывающих поведение.

Чтобы решить свой вопрос, вы можете создать класс проверки с помощью функции глобального уровня и создать для него экземпляр с новым ключевым словом для каждой имеющейся формы.

Так что на самом деле вам просто нужно сделать определение вашего класса функцией. ( Условное обозначение : Capital V просто используется как обозначение для обозначения того, что эта функция является классом)

function Validation()
{
  var fields=new Array();
  var rules=new Array();
  var labels=new Array();
  var errors=new Array();
  var count=0;



  function addError(field,rule,label){
    //add error in errors array
  }

  function validate_required(field){
    //do required validation 
  }

  function validate_email(field){
    //do email validation
  }

  return function(){

      addField = function(f,r,l){
        this.fields[count]=f;
        this.rules[count]=r;
        this.labels[count]=l;
        this.count=count+1;
      }

      validate = function ()
      {
        var valid;
        for (x=0; x< count; x++)
        {
          valid=false;
          switch (this.rules[x])
          {
             case 'required':
               valid=validate_required(this.fields[x]);// create private function
               break;

             case 'email':
               valid=validate_email(this.fields[x]);// create private function
               break;
           }

           if (! valid)
             addError(this.fields[x],this.rules[x],this.labels[x]);
         }

         if (this.hasErrors())
           return false;  
         else
           return true;
       }
   }
}

Чтобы узнать больше о JavaScript и его функциях (и неудобствах), вы можете пройти по на домашней странице Дугласа Крокфорда .it содержит множество простых ссылок на JavaScript, особенно связанных с прототипом и наследованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...