首页 > 代码库 > (3)理解代理 proxy
(3)理解代理 proxy
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
(3)理解代理 proxy
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。