4

基本的に検証メソッドを公開し、1 つの要素の 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"] );

2 番目のパラメーターは、呼び出したいバリデーターの配列です。

優れたオブジェクト指向のアプローチに関する提案はありますか?検証関数を非公開にしたいのですが、それ以外の場合は可能です

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 に答える