考虑以下代码:
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扩展。
答案 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实例才能从中获取属性。