jquery内里val函数重载的完成思绪

所谓重载,就是一组雷同的函数名,有差别个数的参数,在应用时挪用一个函数名,传入差别参数,依据你的参数个数,来决议应用差别的函数!然则我们晓得js中是没有重载的,由于后定义的函数会掩盖前面的同名函数,然则我们又想完成函数重载该怎么办呢?

  1. 第1种要领:

  这类要领比较简朴,给一个思绪,人人一定都能明白,就是函数内部用switch语句,依据传入参数的个数挪用差别的case语句,从而功能上到达重载的结果。

  这类要领简朴粗犷

  1. 第二种要领
function method(obj,name,fnc){
            var old = obj[name];
            console.log(old instanceof Function);
            obj[name] = function(){
                console.log(arguments.length+" "+fnc.length);
                if(arguments.length === fnc.length){
                    return fnc.apply(this,arguments);
                }else if(typeof old === "function"){
                    return old.apply(this,arguments);
                }
            }
        }
        var people = {
            values:["Zhang san","Li si"]
        };
        method(people,"find",function(){
            console.log("无参数");
            return this.values;
        })
        method(people,"find",function(firstname){
            console.log("一个参数");
            var ret = [];
            for(var i = 0;i < this.values.length;i++){
                if(this.values[i].indexOf(firstname) === 0){
                    ret.push(this.values[i])
                }
            }
            return ret;
        })
        method(people,"find",function(firstname,lastname){
            console.log("两个参数");
            var ret = [];
            for(var i = 0;i < this.values.length;i++){
                if(this.values[i] == firstname + " " + lastname){
                    ret.push(this.values[i])
                }
            }
            return ret;
        })
        console.log(people.find());
        console.log(people.find("Zhang"));

完成历程:我们看一下上面这段代码,最主要的是method要领的定义:这个要领中最主要的一点就是这个old,这个old真的很奇妙。它的作用相当于一个指针,指向上一次被挪用的method函数,如许说能够有点不太懂,我们依据代码来讲,js的剖析递次从上到下为。

  1.剖析method(先不论内里的东西)

  2.method(people,”find”,function() 实行这句的时刻,它就归去实行上面定义的要领,然后此时old的值为空,由于你还没有定义过这个函数,所以它此时是undefined,然后继续实行,这是我们才定义 obj[name] = function(),然后js剖析的时刻发明返回了fnc函数,更主要的是fnc函数内里还挪用了method内里的变量,这不就是闭包了,由于fnc函数的完成是在挪用时刻才会去完成,所以js就想,这我实行完也不能删除啊,要不表面谁人用啥,就留着吧先(此处用call函数改变了fnc函数内部的this指向)

  3.好了第一次method的应用完毕了,最早了第二句,method(people,”find”,function(firstname) 然后此次应用的时刻,又要实行old = obj[name]此时的old是什么,是函数了,由于上一条语句定义过了,而且没有删除,那我此次的old现实上指向的是上次定义的要领,它起的作用彷佛一个指针,指向了上一次定义的 obj[name]。然后继续往下剖析,又是闭包,还得留着。

  4.第三此的method挪用最早了,同理old指向的是上次定义的 obj[name] 一样也照样闭包,还得留着。

  5.到这里,内存中现实上有三个 obj[name],由于三次method的内存都没有删除,这是不是是完成了三个函数共存,同时还可以用old将它们联系起来是不是是很奇妙

  6.我们 people.find() 的时刻,就会最早挪用末了一次挪用method时定义的function,假如参数个数雷同 也就是 arguments.length === fnc.length 那末就实行就好了,也不必找别的函数了,假如不雷同的话,那就得用到old了 return old.apply(this,arguments); old指向的是上次method挪用时定义的函数,所以我们就去上一次的找,假如找到了,继续实行 arguments.length === fnc.length 假如找不到,再次挪用old 继续向上找,只需你定义过,一定能找到的,对吧!

  总结:应用闭包的道理使三个函数共存于内存中,old相当于一个指针,指向上一次定义的function,每次挪用的时刻,决议是不是须要寻觅。

后续:说完上面的再对照下面的明白,会更深切的明白原型与原型链

var array=[]
addMethod(array,'sub0',function(){
  return 0;
})
addMethod(array,'sub0',function(prefix){
  console.log("prefix===>",prefix);
  return prefix[0];
})
array.sub0([1,2,3,5])  //这里是array对象具有了sub0如许的要领,而不是Array,addMethod是继续

// 区分于要领直接作用于原型上
//例子  String的 startsWith 完成
function addstartsWithToString(){
   if (typeof String.prototype.startsWith1 != 'function' ) {
     String.prototype.startsWith1 = function(subString){
       return this.slice(0,subString.length)==subString
     }
   }
}

addstartsWithToString();
'120000'.startsWith1('1')
    原文作者:荔枝
    原文地址: https://segmentfault.com/a/1190000016085296
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞