2009-02-22 5 views
0

Так что я хочу создать класс/объект проверки формы в javascript. Как я вижу, что работать будет что-то вроде этого:Javascript OO question

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 и добавляет к нему правила) будет работать?

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

ответ

3

Вам просто не хватает нотации 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

Да, я бы добавил их в настоящий класс, это было то, что я написал для SO. Спасибо, что указали на это: –

0

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

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

Так на самом деле вам просто нужно, чтобы сделать ваше определение класса функции (Конвенция: Столица 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 и его особенности (и неудобства), вы можете пройти через Douglas Crockford's home page. it имеет много простых в использовании ссылок на JavaScript, особенно связанных с прототипом и наследованием.

+0

ummm, вы только что изменили свою первую строку кода (тот, который вызовет синтаксическую ошибку). У вашего кода нет никаких конструкций OO, которые могли бы ответить на его вопрос. –

+0

Мне не нужно добавлять это. к функциям перед его определением, например this.addField() {...}? –

+0

@ Нажмите: да, вы делаете. Этот ответ не будет работать. –