2009-02-22 56 views
0

所以我想在javascript中構建一個表單驗證類/對象。我看到的方式,它的工作是這樣的:Javascript OO問題

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

你只是缺少一些面向對象的表示法。標有"// ***"註釋行,我從你原來的代碼示例改變的:

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編寫的內容。感謝您指出:) – 2009-02-22 16:50:57

0

Javascript是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。它有許多易於遵循的JavaScript引用,特別是與Prototype和繼承有關。

+0

嗯,你剛剛改變了他的第一行代碼(會導致語法錯誤的代碼)。你的代碼中沒有OO構造可以回答他的問題。 – 2009-02-22 17:02:50