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

但我更希望它成为一个函数。

我想这样做的原因是,我想使用 mixin 模式从 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 回答
1

小提琴更新。

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

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

您必须创建 Foo 的实例才能从中获取属性。

于 2013-10-29T12:03:03.803 回答