2012-04-30 20 views
4

私は、基本的にバリデーションメソッドを公開し、1つの要素のIDとバリデータの配列をとり、trueまたはfalseを返す小さな「Validate」オブジェクトを構築しています。javascriptの文字列からプライベート関数を呼び出す方法は?

は、基本的には、これは私が

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  

    } 
    } 
}(); 

を達成した後、第2パラメータiが呼び出すしたいバリデータの配列がある。この

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; 
     } 
    } 
}(); 

を行うことができますが、私はむしろ

VARプライベートno_gits no_uppercase_letters機能を維持したいですelement_valid = Validator.validate( 'myid'、 "no_digits");

+0

私はあなたが何を求めているのかよく分かりませんでした。あなたのコードは私にはうまく見えます... – gdoron

+0

JavaScriptで実際にパラメータとして関数を渡すことができます。したがって、おそらくarrayの要素が関数である[validateNoDigits、validateNoUppercaseLetters]という2番目の引数を渡す必要があります。 – daeq

+0

@gdoronは基本的に配列の繰り返しを行い、変数の名前と同じ名前の関数を呼び出す必要があります。私は自分の質問を編集しました –

答えて

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変数はプライベートです。

+0

はい、これは分かりますが、 "noDigits"という文字列から –

+0

@NicolaPeluchetti:私の答えを更新しました....これは役に立ちます – Thalaivar

+0

はい、そうです!私はプライベートメソッドを持つ内部オブジェクトを宣言する必要があります!http://jsfiddle.netを見てください/ kSK4n/3 /ありがとうございました。 –

1

このアプローチは機能しますか?
jsここに入力してください: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]);​ 
+0

これはうまくいくでしょうが、私はグローバルな名前空間を使用しないようにします。これはありますが、私はメソッドを非公開にしたいと思います。 –

+0

関数シグニチャの代わりに文字列を使用するのは、OO(IMHO)ではなく、OOのアプローチを望む投稿から取ったものです。バリデーターを別のクラスに分けることができます。そうすれば、開発者は必要に応じてバリデータを個別に使うことも、組み合わせたいヘルパーメソッドを渡すこともできます。 – Nope

+0

うん、おそらく私はworngのやり方で自分自身を表現して、あなたのメソッドはokです(私はちょうど名前空間を使用する必要があります)私はちょうど私も他のアプローチを使用することができますか?:) –

関連する問題