2009-02-22 53 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