当前位置:编程学习 > JS >>

这段js代码得拯救你多少时间

 

1.应用案例:

  

        var Mouse = function () {

            // Look! no that = this!

            this.position = [0, 0];

            if (document.addEventListener) {

                document.addEventListener('mousemove', ?);   //this.move?  

            } else if (document.attachEvent) {

                document.attachEvent("onmousemove", ?);     //this.move?怎么放进去

            }

 

        };

        Mouse.prototype.move = function (arg1,arg2,event) {

            event = window.event || event;

            var x = event.pageX || event.offsetX,

        y = event.pageY || event.offsetY;

            this.position = position = [x, y];

            this.log(arg1,arg2);

        };

        Mouse.prototype.log = function (arg1, arg2) {

            console.log(arg1+","+arg2);

            console.log(this.position);

        };

        new Mouse();

www.zzzyk.com

上面你知道'?'号那里要干嘛了吗?我想给document的mousemove绑定我的move方法,但是遇到难题了,这样的话,Mouse.prototype.move

里的this就不会指向Mouse的对象,相信大家经常碰到这种问题.也许你早知道了怎么解决,但是有更快更简单的方法吗?答案是:

  Function.prototype.bind()这个神奇的玩意,但是ie6 7 8都不支持,一般现代浏览器都支持了,我们接下来要做的就是模仿他,

 这么好的方法当然要模仿它,怎么模仿见下面nothing的原创方法

    (function () {

            var proxy = function (fn, target) {

                var proxy = function () {

                    if (2 < arguments.length) { //存在被代理的函数有参数的时候

                        var privateArgs = Array.prototype.slice.call(arguments, 2);

                      //从第二个开始取出来,[this,绑定的对象,参数列表]

                        return function () {

                            var args = Array.prototype.slice.call(arguments);

        -->这里的arguments与外面的不是同一个,这个是被代理的函数内部的arguments对象,

       比如这里的move函数的  arguments[0]=[object Event]就是这个事件内部的e参数

 

                            Array.prototype.unshift.apply(args, privateArgs);

 

       -->这里在加上传进来的参数,就实现了,和原生bind一样的参数形式

     //->而且这里是把私有的参数放到前面的比如a=new Mouse();a.move(1,2);

      //如果这个move方法没有参数,意思就是prototype.move=fn(){arguments} ,

      //而我传进来了参数,参数的arguments.length=3,

       //arguments[0]=1,arguments[1]=2,arguments[2]=[object event].

 

                            return fn.apply(target, args);

                        }

                //这里之所以搞复杂了,是因为,在被代理的函数可以直接访问arguments,比如我不给被代理的函数传参数,而直接使用

                 //这样这个arguments就会包含与原生Function.prototype.bind的arguments一样的对象,

                 //这里代码深奥,是因为你没理解这里原生的bind里面的arguments是什么,知道了,就知道为什么绑定我自己的arguments

                //做这么多,主要目的就是使你被代理的函数内部的arguments与function.prototype.bind里的arguments对象包含的东西一致

                    }

             

                    return function () {

                        return fn.apply(target, arguments);

                    }

                }

                return proxy.apply(null, arguments);

            };

            /*支持原生的使用原生的*/

            Function.prototype.bind = Function.prototype.bind ||

    function (target) {                   //这里的this指代要被代理的函数

        if (1 < arguments.length) {

            var args = Array.prototype.slice.call(arguments, 1);  //取出参数列表

            args.unshift(this, target);  //这个args最终变成了[this,绑定的对象,参数列表]

           

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,