猿问

Javascript 中实现方法重载的问题

    var obj = {

      name : ["Dean Edwards", "Sam Stephenson", "Alex Russell", "Dean Tom"]

    };


    function addMethod(obj , name , fn){


        var old2 = obj[name];


        obj[name] = function(){


            if(fn.length == arguments.length){

                return fn.apply(this , arguments);

            }

            else if(typeof old2 === 'function'){


                console.log(old2 == obj[name]);  //这里为什么是不相等的呢?


                return old2.apply(this , arguments);

            }

        };

    }


    addMethod(obj , "find" , function(){

        return this.name;

    });

    addMethod(obj , "find" , function(firstname){

        var ret = [];

        for(var i = 0 ; i < this.name.length; i++){

            if(this.name[i].indexOf(firstname) === 0){

                ret.push(this.name[i]);

            }

        }

        return ret;

    });

    addMethod(obj , "find" , function(firstname , lastname){

        var ret = [];

        for(var i = 0 ; i < this.name.length; i++){

           if(this.name[i] === firstname + " " + lastname){

               return ret.push(this.name[i]);

           }

        }

        return ret;

    });


    console.log(obj.find());

    console.log(obj.find('Dean'));

    console.log(obj.find('Dean','Edwards'));


old2.apply(this , arguments);请问这段代码是怎么理解的呢,以及方法绑定的链条是怎么样的呢?请各位大神解答一下,谢谢啦!为什么可以向上调用old指向的上个方法。


Neokekeke
浏览 887回答 1
1回答

橋本奈奈未

闭包。挺复杂的,看起来真费劲。old2是上次添加进来的function,apply方法是使用指定的上下文对象调用该函数。逻辑大概是这样的:     find()调用;     执行最后一次添加的匿名函数即两个参数的那个;     fn.length指的是该函数有多少个必须要传入的参数,即形参的个数。arguments是实际传入的参数。2!=0;    执行old2并指定其上下文为obj,old2因为闭包指向的是上一次添加的函数引用。即执行第二次添加的函数。重复上个步骤。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答