作者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