论坛首页 AJAX版 JavaScript

Javascript函数加壳,欢迎高手拍砖!

浏览 727 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-12-03 关键字: 函数技术
<script>
//逸云.framework by Neequ
//帮助:将改写函数体,使得同名函数可以同时执行
//func 将之加壳的函数体字符串
//name 函数名
//obj 可选,默认为 window,为应用函数的父对象,多用于事件绑定
function addShell(func,name,obj) {
	func=Function(func);
	if(!obj) obj=window;
	var old = obj[name];
	if (typeof obj[name] != 'function') {
		obj[name] = func;
	}
	else {
		obj[name] = function() {
			var ja=[];
			var t = obj[name].arguments;
			for(var x=0;x<t.length;x++)
			ja.push(t[x]);
			old.apply(null,ja);
			func.apply(null,ja);
		}
	}
}
//--测试代码开始--
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");

addShell('aaa("1111","3333","5555")',"onload");
addShell('aaa("1","3","5")',"onload");
//--测试代码结束--
</script>


----------------------个人签名--------------------------

搜狐招聘前台技术工程师
条件一:对 javascript 制作技术有足够信心者;
条件二:在北京,能快速面试;
当然最好能了解部分后台技术者,您将可以参与搜狐门户内容部大型网络产品架构与设计。
待遇从优,机不可失,欢迎咨询与推荐!
简历发到 Email: NeequNie@sohu-inc.com,或联系 MSN:Neequ@hotmail.com,联系人,聂先生。

----------------------个人签名--------------------------
   
最后更新时间:2007-12-04

很佩服lz加壳的精神~~~也就是管道机制的函数~~而且还不支持管道的输入输出~~~~

而且,参数只能用函数字面量~~~~

和lz相同效果的代码,适用于AOP

js 代码
  1. Function.extend=function(destination,source,callOrder) {   
  2.         var callBefore=(callOrder==null?false:(callOrder=='before'?true:false));   
  3.            
  4.         var __callMode__=function(obj,fns,argument) {   
  5.             var result;   
  6.             var args=[obj,fns].concat($A(argument));   
  7.        
  8.             if (fns instanceof Function && typeof fns=='function') {   
  9.                 result=fns.apply(obj,argument);   
  10.             } else if (fns instanceof Array) {   
  11.                 result=Function.iterate.apply(null,args);   
  12.             } else  if (fns instanceof Object) {   
  13.                 result=Function.each.apply(null,args);   
  14.             }   
  15.             return result;   
  16.         }   
  17.            
  18.         return function() {   
  19.             var fn={};   
  20.                
  21.             if (callBefore) {   
  22.                 fn.before=source;   
  23.                 fn.after=destination;   
  24.             } else {   
  25.                 fn.before=destination;   
  26.                 fn.after=source;   
  27.             }   
  28.                
  29.             var result=null;   
  30.             var args=$A(arguments);        
  31.             if (fn.before) {   
  32.                 result=__callMode__(this,fn.before,args)   
  33.             }   
  34.             if (result!=null) args.push(result);   
  35.             if (fn.after) {   
  36.                 var _result=__callMode__(this,fn.after,args)   
  37.                 if (_result!=null) {   
  38.                     result=_result;   
  39.                 }   
  40.             }   
  41.             return result;   
  42.         }   
  43.     };   
  44. catch(e) {   
  45.     alert(e.message);   
  46. }  
js 代码
  1. Function.iterate=function(obj,fn_list) {   
  2.     var args=$A(arguments).slice(2);   
  3.     var result=null;   
  4.     for (var i=0;i<fn_list.length;i++) {   
  5.         var fn=fn_list[i];   
  6.         var arg=(result!=null?args.concat([result]):args);   
  7.         var newResult=fn.apply(obj,arg)   
  8.         if (fn) result=(newResult==undefined?result:newResult);   
  9.     }   
  10.     return result;   
  11. }   
  12.   
  13.   
  14. Function.each=function(obj,fn_set) {   
  15.     var result={};   
  16.     var args=$A(arguments).slice(2);   
  17.     var i=0;   
  18.     if (fn_set instanceof Array) {   
  19.         for (var i=0;i<fn_set.length;i++) {   
  20.             if (fn_set[i]) result['$'+i]=fn_set[i].apply(obj,args);   
  21.         }   
  22.     } else if (fn_set instanceof Object) {   
  23.         for (var fn in fn_set) {   
  24.             if (fn_set[i]) {   
  25.                 result[fn]=fn_set[fn].apply(obj,args);   
  26.                 result['$'+(i++)]=result[fn];   
  27.             }   
  28.         }   
  29.     }   
  30.     return result;   
  31. }  
   
0 请登录后投票
最后更新时间:2007-12-04
晕,你不觉得这样很复杂吗?

如果代码中有大量的这样的同名函数,你的处理逻辑肯定也清晰不到那里去。

个人感觉应该避免这样的同名函数,而不是给它创造条件!


当然了,耍酷眩耀可以!
   
0 请登录后投票
最后更新时间:2007-12-04
这主要是一个应用类型的方法,有这个需求的时候反而更多的时候是需要动态函数,即函数字面量。ajaxgo 你的函数很规范,不错 ^_^


楼上,这个功能很实用,而不是耍酷。例如我要给某一个按钮,在原先的效果基础上,再添加一种动态样式或动态事件,那么就会用到了。另外还可以解决大批量页面合并的时候,接口兼容性的问题,因为现在跨域接口调用都得用JS函数的形式。
   
0 请登录后投票
最后更新时间:2007-12-04
lZ 写的代码不厚道
<script> 
//逸云.framework by Neequ  
//帮助:将改写函数体,使得同名函数可以同时执行  
//func 将之加壳的函数体字符串  
//name 函数名  
//obj 可选,默认为 window,为应用函数的父对象,多用于事件绑定  
function addShell(func,name,obj) {  
    func=Function(func);  
    obj= obj || window;  
    var old = obj[name];
var f = (typeof obj[name] != 'function');
f && (obj[name] = func) || f || (obj[name] = function() {old.apply(null,arguments); func.apply(null,arguments);} ) 
}
//--测试代码开始--  
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");  
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");  
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");  
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");  
addShell('alert(arguments[0]+":"+arguments[1]+":"+arguments[2])',"aaa");  
 
addShell('aaa("1111","3333","5555")',"onload");  
addShell('aaa("1","3","5")',"onload");  
//--测试代码结束--  
</script>
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐