有没有办法迭代函数范围内的公共方法?

时间:2013-10-29 11:55:51

标签: javascript

考虑以下代码:

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 个答案:

答案 0 :(得分: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;

答案 1 :(得分:4)

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

答案 2 :(得分:2)

尝试

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

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

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

注意new Foo()

答案 3 :(得分:1)

小提琴更新。

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

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

你必须创建一个Foo实例才能从中获取属性。