4

我正在构建一个小的“验证”对象,它基本上公开了一个验证方法,并获取一个元素的 id 和一组验证器,然后返回 true 或 false。

基本上这就是我想要实现的

var Validator = function() {
  var no_digits = function( el ) {
      return true;
  }
  var no_uppercase_letters = function( el ) {
      return true;
  }
  return {
     validate: function( element_id, validators ) {

        //here i would like to iterate on the validators array and for each 
        //element of the array i would like to check if a function of the same name 
        // exist and call that function passing the element      

     }
  }
}();

然后这样称呼它

var element_valid = Validator.validate( 'myid', [ "no_digits", "no_uppercase_letters"] );

其中第二个参数是我想调用的验证器数组。

关于一个好的面向对象方法的任何建议?我想保持验证函数私有,否则我可以这样做

var Validator = function() {


    return {
        validate: function(element_id, validators) {
            console.log(this);
            this[validators]();

            // Validator[validators](element_id);     
        },
        no_digits: function(el) {
            alert('hi');
            return true;
        },
        no_uppercase_letters:  function(el) {
            return true;
        }
    }
}();

但我宁愿将 no_gits 和 no_uppercase_letters 函数保持为私有

var element_valid = Validator.validate('myid', "no_digits");

4

2 回答 2

3
var valdiate = (function() {  

     var _p={};//toss all private members into a single object.
     _p.list=[];
     _p.init=function(){
       _p.list=[];
     };

    var noDigits = function() {

    };

    //public members. use "this" to reference object followed by the method.
    //however valdiate._p.list won't be accessible to the global scope    
    return {    
        check: function() {
              noDigits();
        },
        fnNaMe1:function(){
              _p.init();
        },
        fnName2:function(){
           return _p.list.slice(0);//return a clone  
        }
    };
})();

它被称为“模块模式”。这种模式在 JavaScript 中通常被称为简单的“封装”。闭包是另一种可能,但更具体地说,在这种情况下它纯粹是封装。

封装只是意味着您将某些成员设为私有。在这种情况下什么是私有的?那么noDigits在这种情况下,变量是私有的。

于 2012-04-30T20:36:44.993 回答
1

这种方法行得通吗?
jsFiddle在这里:http: //jsfiddle.net/FranWahl/KZKwA/玩。
请注意,我没有实现任何实际验证,但基本框架确实执行了。

var Validator = function() {
    return {
        validate: function(element_id, validators) {
            for (var i = 0; i < validators.length; i++) {
                var result = validators[i](element_id);
                alert(result);
                // record results... or do something else with it or break; etc...
            }
        }
    }
}();

var no_digits = function(theValue) {
    // validate no digits are in the given value....
    if(theValue === '1')
    {
        return true;
    }
    else
    {
        return false;
    }
};

var no_uppercase_letters = function(theValue) {
    // validate no uppercase letters are in this value...
    if(theValue === '4')
    {
        return true;
    }
    else
    {
        return false;
    }
};

// I used variables to store the methods but feel free to declare the methods inline instead...
var element_valid = Validator.validate('4', [no_digits , no_uppercase_letters]);​
于 2012-04-30T20:24:25.423 回答