2013-10-29 11 views
5

は、このコードを考えてみましょう。 Fooのプロパティとpublicメソッドを反復処理する方法はありますか? Fooが次のようにオブジェクトリテラルであった場合はうまくいくでしょう:関数スコープ内のパブリックメソッドを反復処理する方法はありますか?</p> <pre><code>var Foo = function() { this.bar = []; this.hello = function() { this.name = "world"; }; }; for (var property in Foo) { alert(111); } </code></pre> <p>それは何もしません:

var Foo = { 
    bar: [], 

    hello: function() { 
     this.name = "world"; 
    } 
}; 

for (var property in Foo) { 
    alert(111); 
} 

しかし、私はそれが関数であることを好むでしょう。

私がこれをしたい理由から、mixinパターンを使ってFooから拡張したいと思います。

http://jsfiddle.net/ChU2V/

答えて

6

あなたが仕事に、このためFooの実際のインスタンスが必要になります。

var foo = new Foo(); 
for (var property in foo) { 
    alert(111); 
} 

そうでない場合、プロパティは、それがプログラムコードに到達したことがないだという、ある意味では単に「仮想」です。それ以外

、あなたはプロトタイプのプロパティを定義することができます。

var Foo = function() {}; 
Foo.prototype = { 
    bar: [], 

    hello: function() { 
     this.name = "world"; 
    } 
}; 

して、ループをFoo.prototype上。しかし

var possible_props = Foo.toString().match(/\bthis\.\([a-zA-Z0-9_]+)\s*=/g); 
// will yield an array similar to this: 
// ["this.bar =", "this.hello ="] 

注これは非常にエラーが発生しやすいとをお勧めではないことを、:あなたがしなければならない場合

最後に、動的言語である、JSはまた、あなたが完全に狂って行くことができます。たとえば、次のようなケースは検出されません。

var that = this; 
that.baz = null; 
2

var Foo = function() { 
    this.bar = []; 

    this.hello = function() { 
     this.name = "world"; 
    }; 
}; 

for (var property in new Foo()) { 
    alert(111); 
} 

お知らせnew Foo()を試してみてください。

4
for (var property in new Foo()) { 
    console.log(property); 
} 
1

フィドルが更新されました。あなたはそれのオフの特性を得るためにはFooのインスタンスを作成する必要が

http://jsfiddle.net/sujesharukil/ChU2V/2/

var fooInstance = new Foo(); 
for(var property in fooInstance){} 

関連する問題

 関連する問題