2009-07-12 11 views
4

の関数内のオブジェクトのすべてのメンバーの上にそれは非常に便利になります:反復私はこれを行うことができれば、そのオブジェクト

var MyObject = function(param1, param2, ... paramN) 
{ 
    this.var1 = stuff; 
    this.var2 = moreStuff; 
    . 
    . 
    . 
    this.varN = nStuff; 

    this.validate = function() 
    { 
     for(var current in this) 
     { 
      alert(current); 
      //validate all member variables (even this function I suppose) 
     } 
    }; 
}; 

しかし、これは私が望むものを行うためにを思えませありません。私は、ループが最終的にはそれを親関数にループさせなければならないことを理解しています(これもまた驚くことではありません)。

第2の関数の 'this'は第2の関数を参照し、第1の関数ではないため、これは不可能ですか?またはキーワード 'this'はパブリックメンバーの宣言演算子であり、外側のオブジェクトへの参照ではありませんか?

私はこのようにしたいものを得るのは不可能ですが、私はこの動作を達成するために別の方法がありますか?

+0

なぜこれをやりたいですか?別の関数を呼び出す... –

+0

別の外部関数を呼び出すことを意味しますか?スタイルが賢明です私はこれがモデルをカプセル化する方法を好むと思いますが、私は髪を分割することができます。 –

答えて

5

は、私はあなたがメンバーの値を取得しようとし、それについて間違った道を進んでいると思うので、これを試してみてください。

 var MyObject = function() { 
     this.var1 = 'var 1 value'; 
     this.var2 = 'var 2 value'; 
     this.varN = 'var n value'; 
     var self = this; 

     this.validate = function() { 
      for (var member in self) { 
      if (!self.hasOwnProperty(member) || typeof(self[member]) === "function") continue; 
      alert(self[member]); 
      } 
     }; 
     }; 

     var m = new MyObject(); 
     m.validate(); 

説明するには、ループは、プロパティがObjectオブジェクトから継承されるのではなく、ユーザ定義のプロパティであるか最初にチェックします。また、メンバが(validate()のような)関数ではないことを確認した後、メンバの値を警告します。

memownersを反復処理するときのベストプラクティスとして、Douglas Crockford(JSの父)がhasownpropertyチェックを推奨しています。このことができます

希望、

ダルコ

EDITは:selfを言及するのを忘れた - 私はこれが含まれているため、あなたのこれはあなたがそれを可能にするものを実際にあることを確認し、その標準的な方法。

+0

いいですね。ご協力いただきありがとうございます。 –

+0

機能チェックを追加するための功績。人々はいつもそれを忘れているようです。 – seth

+0

うれしい私は助けることができます。セス、同意した! –

1

どのようにvalidateに電話しますか?

次のコードは、私のために正常に動作します:

var MyObject = function(){ 
    this.var1 = 'stuff'; 
    this.var2 = 'moreStuff'; 
    this.varN = 'Stuff'; 

    this.validate = function() 
    { 
     for(var current in this) 
     { 
      alert(current); 
     } 
    }; 
}; 

var m = new MyObject(); 
m.validate(); 
+0

これを実行すると、すべてのメンバーが「未定義」です –

関連する問題