作者sk1765 (鼎玉鉉)
看板Ajax
標題Re: [問題] 在Function中取得Function Name
時間Thu Feb 10 22:05:55 2011
※ 引述《IwillSay (我將會)》之銘言:
: 請問假如我有一個object長這樣
: var fns = {
: MethodA : function() {
: //alert(???); 在這邊取得MethodA的字串
: }
: };
: 請問有辦法在MethodA裡面取得他對應的Property Name嗎(MethodA)
var fns = {
a1 : 123,
a2 : 456,
a3 :"xxx",
Method1 : function() {
alert(this.a1);
},
MethodA : function (){
var name;
for (name in this) {
if (this.hasOwnProperty(name) && typeof this[name] === 'function' &&
arguments.callee === this[name]) {
break;
}
}
alert(name);
},
Method2 : function() {
alert(this.a2);
}
};
fns.Method1();
fns.Method2();
fns.MethodA();
http://www.jsfiddle.net/5E4eq/8/
先用for 循環this
由於for in 會讀取所有prototype chain 上的 property
所以用hasOwnProperty過濾
並用typeof 只讀取function
最後再比對是不是同一個function object
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.14.51
※ 編輯: sk1765 來自: 61.59.14.51 (02/10 22:24)
1F:推 dreamerslab:酷耶沒想過有這招 02/10 23:15
2F:→ dreamerslab:不過是不是只要if (arguments.callee === this[name]) 02/10 23:22
3F:→ dreamerslab:這樣就可以了,比較快 02/10 23:23
4F:推 s25g5d4:這樣不一定會比較快吧... 02/10 23:26
5F:推 s25g5d4:不過話又說回來 typeof 取得的東西其實有點陷阱... 02/10 23:31
6F:→ dreamerslab:判斷一個項目不會比判斷三個項目快嗎? 02/10 23:44
7F:→ s25g5d4:這是個好問題 要看實際情況來說 假如這個物件裡塞了一堆不 02/10 23:52
8F:→ s25g5d4:是function 的屬性 那麼先判斷他的typeof理論上會比較快 02/10 23:53
9F:推 IwillSay:感謝 多學了幾個新東西 02/11 00:42
10F:推 othree:我比較好奇為什麼會有這樣需求@@ 02/11 00:55
11F:推 dreamerslab:比如debug,或是自己刻一個mvc從controller自動抓 02/11 01:02
12F:→ dreamerslab:action name去對應到view... 02/11 01:02
13F:推 othree:這些需求都直接寫成字串就可以了吧 02/11 01:22
14F:推 dreamerslab:是阿,可是每一次都render('blahblah..')很煩人,或是每 02/11 02:25
15F:→ dreamerslab:次debug('methodName,.....');如果能自動抓比較方便摟 02/11 02:26
16F:推 s25g5d4:要debug幫匿名函數命名不就得了= = 02/11 07:27
17F:→ TonyQ:我覺得真的要debug的話還不儒學著用breakpoint跟stacktrace 02/11 08:10
18F:推 IwillSay:其實只是突然好奇能不能這麼做而已 若可以程式彈性會變大 02/12 00:02
19F:推 IwillSay:不過這樣跑迴圈走返自身屬性的成本有點大..所以放棄 orz 02/12 00:15
20F:推 IwillSay:主要的需求簡單的說明是 有一個物件可以動態添加方法 02/12 00:18
21F:→ IwillSay:有一個物件可以動態添加對應名稱的新物件 屬性不一定 02/12 00:18
22F:→ IwillSay:因為名字會有對應 所以假如可以取得自身的屬性名稱可以 02/12 00:19
23F:→ IwillSay:比較好抓資料 這樣外部呼叫的時候僅需要呼叫方法就好 02/12 00:19
24F:→ IwillSay:不過現在是先把name當成參數來處理掉 02/12 00:20