5

次のコードを検討してください。

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

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

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

それは何もしません。Foo のプロパティとパブリック メソッドを反復処理する方法はありますか? 次のように、Foo がオブジェクト リテラルの場合に機能します。

var Foo = {
    bar: [],

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

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

しかし、代わりに関数であることが望ましいです。

私がこれをしたい理由は、ミックスインパターンを使用して Foo から拡張したいからです。

http://jsfiddle.net/ChU2V/

4

4 に答える 4

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ます。

最後に、動的言語である JS は、必要に応じて完全に夢中になることもできます。

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

ただし、これは非常にエラーが発生しやすく、推奨されないことに注意してください。たとえば、次のようなケースは検出されません。

var that = this;
that.baz = null;
于 2013-10-29T12:02:36.940 に答える
4
for (var property in new Foo()) {
    console.log(property);
}
于 2013-10-29T12:02:36.577 に答える
2

試す

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

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

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

に注意してnew Foo()ください。

于 2013-10-29T12:02:07.620 に答える