• 面向对象this指向


    以前不太理解面向对象的this指向问题,今天自己看着视频教程,加自己学了2个例子,终于明白点了。

    我们在写对象程序的时候,我们希望保持this始终是指向对象的,但事实确常常事与愿违。

    正常情况this的指向都没问题,比如下面

     1 //构造函数
     2 function createPerson(name,age){
     3     this.name=name;
     4     this.age=age;
     5     this.showName();    
     6 }
     7 //原型方法
     8 createPerson.prototype.showName=function(){
     9     console.log('我的名字是:'+this.name+'我的年纪是:'+this.age);    
    10 }
    11 //调用结果为 我的名字是:程序员我的年纪是:27
    12 new createPerson('程序员','27');
    13 
    14 //可以看到这里的this始终指向 createPerson对象

    但工作的写代码不会那么简单alert一个值,常常会加入事件等等,这时候this的指向是怎样的呢?还会指向对象么?看下面

     1 function tabSwitch(id){ 
     2         this.oDiv=document.getElementById(id);
     3         this.btn=this.oDiv.getElementsByTagName('input');
     4         this.div=this.oDiv.getElementsByTagName('div');
     5     }
     6     tabSwitch.prototype.tab=function(){ 
     7         for(var i=0;i<this.btn.length;i++){            
     8             this.btn[i].index=i;
     9             this.btn[i].onclick=function(){
    10                 alert(this);//object HTMLInputElement
    11             }
    12 
    13         }
    14     }

    看到了么this,变成了html的一个节点,这时候再继续写下边的代码,肯定就错了。这时候我需要改下this的指向,让this重新指向对象。继续

     1 function tabSwitch(id){ 
     2         this.oDiv=document.getElementById(id);
     3         this.btn=this.oDiv.getElementsByTagName('input');
     4         this.div=this.oDiv.getElementsByTagName('div');
     5     }
     6     tabSwitch.prototype.tab=function(){ 
     7         //把对象中的this存下来赋值为_this
     8         var _this=this;
     9         for(var i=0;i<this.btn.length;i++){            
    10             this.btn[i].index=i;
    11             this.btn[i].onclick=function(){
    12                 alert(_this);//object
    13             }
    14 
    15         }
    16     }

    用_this变量缓存指向对象的this就可以在正确的地方 用到正确的指向。(有点绕晕了)

    最后上一个今天尝试些的复杂一点点的例子:左右点击按钮滑动切换ul

     1 function slideMove(moveUl,arrowLeft,arrowRight,marginRight){                             
     2     this.moveUl=$('#'+moveUl);
     3     this.liLength=$('#'+moveUl).find('li').length;
     4     this.liWidth=$('#'+moveUl+'>li').eq(0).innerWidth()+marginRight;
     5     this.arrowLeft=$('#'+arrowLeft);
     6     this.arrowRight=$('#'+arrowRight);
     7     this.path=0;
     8     this.moveUl.css('width',this.liWidth*this.liLength);
     9     this.init();//初始化
    10 }
    11 slideMove.prototype.init=function(){
    12     var _this=this;//对象
    13     this.arrowLeft.on('click',function(){ 
    14         _this.clickLeft();
    15     });
    16     this.arrowRight.on('click',function(){ 
    17         _this.clickRight();
    18     });
    19 }
    20 slideMove.prototype.clickLeft=function(){ 
    21     
    22     console.log(this.path)
    23     //到左边了return掉
    24     if(this.path<=0){ 
    25         this.path=0;
    26         return false;
    27     }
    28     this.path--;
    29     this.moveUl.stop().animate({'left':-this.path*this.liWidth});
    30 }
    31 slideMove.prototype.clickRight=function(){ 
    32     
    33     console.log(this.path)
    34     //到了右边return掉
    35     if(this.path>=this.liLength-4){ 
    36         this.path=this.liLength-3;
    37         return false;
    38     }
    39     this.path++;
    40     this.moveUl.stop().animate({'left':-this.path*this.liWidth});
    41 }
    42 //调用
    43 var slide1=new slideMove('moban_ul1','arrow_left1','arrow_right1',22);
  • 相关阅读:
    IDE配置 Clion搭建算法竞赛用的IDE
    [Atcoder]AtCoder Beginner Contest 234 题解
    react通过setupProxy处理跨域
    ES6追加方法
    记疫情在家爬表情包 Python
    shell 判断条件,退出程序
    test
    ggplot2 分面 fact_grid() facet_wrap()
    YuLabSMU 截断部分坐标轴 留些空白
    ggplot2 注释文本到图所展示的数据上
  • 原文地址:https://www.cnblogs.com/ollie-sk8/p/4147247.html
Copyright © 2020-2023  润新知