(3)理解代理 proxy

本文介绍JavaScript中通过代理模式解决事件监听器中this指向问题的方法。通过具体实例展示如何利用闭包和原型链确保函数内部this的正确上下文,实现代码的复用性和可维护性。
var Class = function(){
        var klass = function(){
            this.init.apply(this,arguments);
        };
        klass.prototype.proxy = function(func){
            var self = this;
            return (function(){
                return func.apply(self,arguments);
            });
        };

        klass.prototype.include = function(obj){
            for(var i in obj){
                klass.prototype[i] = obj[i];
            }
        };
        return klass;
    };

    var buton = new Class();
    buton.include({
        init:function(element){
            this.element = jQuery(element);
            //保证上下文一致,保证click function的作用于是整个上下文
            this.element.click(this.proxy(this.click));
        },
        click:function(){},

    });

看这个一段使用代理的代码,里面的一片代码

 klass.prototype.proxy = function(func){
            var self = this;
            return (function(){
                return func.apply(self,arguments);
            });
        };

简单点描述就是proxy代理里面的func方法,它的作用域会放到外面一层的作用域,使上下文一致。

理解代理,我们可以看一下这段代码

var Car = function(){
        this.CarName = "Mini";
    };

    Car.prototype.getName = function(){
        document.getElementById('nameBtn').addEventListener('click',function(){
            console.log(this.CarName);
        })
    };

    var car = new Car();
    car.getName();//undefined

为什么会爆undefined呢?是因为在addEventListener里面this指针的作用域和Car里面的指针作用域不一样。addEventListener里面没有this.CarName

所以解决的方案是:

var Car = function(){
        this.CarName = "Mini";
    };

    Car.prototype.getName = function(){
        var self = this;
        document.getElementById('nameBtn').addEventListener('click',function(){
            console.log(self.CarName);
        })
    };

    var car = new Car();
    car.getName();//Mini

=======================================================================================

最后的版本:

 var Car = function(){
        this.CarName = "Mini";
    };

    Car.prototype.getName = function(){
        document.getElementById('nameBtn').addEventListener('click',this.proxy(this.clickEvent));
    };
    Car.prototype.proxy = function(func){
        var self = this;
        return (function(){
            return func.apply(self,arguments);
        });
    };

    var car = new Car();

    car.clickEvent = function(){
        console.log(this.CarName);
    };
    car.getName();//Mini

 

转载于:https://www.cnblogs.com/lihaozhou/p/3973633.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值