2013-10-29 118 views
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/

回答

6

您需要的Foo一個實際的實例,該工作:

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

否則,性能只是「虛擬」在這個意義上,它從來沒有達到的程序代碼。在Foo.prototype

var Foo = function() {}; 
Foo.prototype = { 
    bar: [], 

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

,然後循環:

除此之外,你可以在原型定義的屬性。

最後,是一個動態語言,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; 
2

嘗試

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

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

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

通知的new Foo()

4
for (var property in new Foo()) { 
    console.log(property); 
} 
相關問題