有没有办法迭代函数作用域内的公共方法

Is there a way to iterate over public methods inside a function scope?

本文关键字:方法 作用域 迭代 函数 有没有      更新时间:2023-09-26

请考虑以下代码:

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/

你需要一个实际的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;
for (var property in new Foo()) {
    console.log(property);
}

尝试

var Foo = function () {
    this.bar = [];
    this.hello = function () {
        this.name = "world";
    };
};
for (var property in new Foo() ) {
    alert(111);
}

请注意new Foo()

小提琴更新。

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

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

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