开放利于互联网创新与发展,写博文无非就是帮助网友解决问题、思想碰撞、诞生创新,但是我非常恶心转载之后还写个“原创”的人,如需转载请注明出处,请尊重原创,Thank you!
我们通常在写程序的时候需要统一的对所有代码进行权限验证,如果没登陆则不允许继续访问,这种可以用拦截器的思想来做,反观js,我们是否也有这种类似的场景呢?比如我对输入的数据进行验证是否符合规定,你可以说我直接写在函数里面就好了呀,如下:
- var t = function (txt) {
- if(txt.v<100){
- alert("输入的数字必须大于100");
- return false;
- }
- alert("调用 t 您输入了正确的数字:" + txt.v);
- return txt;
- }
- t({v:100});
嗯,如果我突然发现100个函数都要检查输入呢?
你说可以写成这样:
- var check=function(txt){
- if(txt.v<100){
- alert("输入的数字必须大于100");
- return false;
- }
- }
- var t1 = function (txt) {
- if(!check(txt)){
- return false;
- }
- alert("调用 t 您输入了正确的数字:" + txt.v);
- return txt;
- }
- var t2 = function (txt) {
- if(!check(txt)){
- return false;
- }
- alert("调用 t 您输入了正确的数字:" + txt.v);
- return txt;
- }
- t1({v:100});
- t2({v:293});
ok,这样确实也可以,但不得不说,你不觉的每个函数里面都要写个if语句和return很恶心么?就算不恶心,现在我要求写10个验证,验证是否是字母,是否身份证,blabla....
意味着你每个函数里面要写10个判断,如果我还要求t1需要作验证但除了字母和数字,t2除了数字不验证,你蛋疼了么?是不是很操蛋这种需求,至少我觉得这种需求完全是bullshit,但是程序嘛,我们追求通用、艺术(请允许我用艺术来装一下B)。
我们可以用一种更优雅的方式来实现这个操蛋的需求并且装一次优雅的B:
1.首先定义一个aop,aop里面加一个函数before,他的作用就是给指定的函数注入逻辑代码,也就是说在我们的函数执行之前先执行注入的代码
2.定义一个原始函数t,即我们需要被注入逻辑处理的函数,没注入之前他啥也不验证,任何参数都说合法
3.定义逻辑处理函数若干,命名为:bh1,bh2,如果你还想更操蛋更优雅那你多写几个
4.在执行原始函数t之前对这个函数注入逻辑处理,至于注入几个这个请根据你具体想装B到啥程度
5.最后调用t吧,你会看到他会根据给t注入时设置的验证规则(全成功则执行t,全失败则执行t,有一个成功则执行t,有一个失败则执行t),有同学要丢我板砖,有一个执行成功不就代表必定有一个失败吗?在某种情况下还是不一样的。
- var aop = {
- isPass: function (t, f, s, mode) {
- switch (mode.toString().toUpperCase()) {
- case "AS": //all success
- return t === s;
- case "AF": //all fail
- return t === f;
- case "OS": // one success
- return s > 0;
- case "OF": // one success
- return f > 0;
- default:
- return t === s; //all success
- }
- }
- , before: function (name, f, check, mode) {
- var thisObj = this;
- var orign = eval(name);
- var func = function () {
- var fail = 0;
- var success = 0;
- for (var i in f) {
- if (!(f[i].apply(this, arguments))) {
- fail++;
- } else {
- success++;
- }
- }
- if (check) {
- if (thisObj.isPass(f.length, fail, success, mode)) {
- return orign.apply(this, arguments);
- }
- } else {
- return orign.apply(this, arguments);
- }
- }
- eval(name + " = func;");
- }
- };
- // 原始函数
- var t = function (txt) {
- alert("调用 t 您输入了正确的数字:" + txt.v);
- return txt;
- }
- //业务逻辑1
- function bh1(arg) {
- if (/^(\d+)|(\d+\.\d)$/.test(arg)) {
- return true;
- } else {
- alert("只能输入数字");
- return false;
- }
- }
- //业务逻辑2
- function bh2(arg) {
- if (parseFloat(arg.v) > 100) {
- return true;
- } else {
- alert("输入的数必须大于100");
- return false;
- }
- }
- $(function () {
- // 参数:函数名,过滤器数组,是否验证,验证模式(as表示all success,表示如果有一个失败则不执行函数t)
- aop.before("t", [bh1,bh2], true, "as");// 添加拦截器
- var o = { v: 99 };//参数值
- t(o);
- })