关于面向对象中this指向问题

作者: mogugit | 来源:发表于2016-06-04 17:55 被阅读1075次

    this指向


    今天就和大家来探讨一下在js面向对象中的这个this的指向问题,

    一般来讲在函数中this的指向是当前函数的拥有者,也就是说当前谁这个函数,那么这个this就指向谁.

    例:这里有一按钮 btn

    <input type ="button" id ="btn">

    document.getElementById('btn').onclick = function(){

           alert(this)//input

    }

    此时this是指向按钮 btn

    第一种情况:

    在面向对象中用了定时器

    这里有一个对象;

    function fn(){

        this.a= 1;//fn中的一个属性

    }

    fn.prototype.show = function(){

       alert(this.a)//fn原型链上的一个方法

    }

    var obj = new fn();//实例化的时候

    obj.show();//执行以下show()方法,弹出值为1

    现在我们给这个对象加一个定时器看会怎么样

    function fn(){

    this.a= 1;//fn中的一个属性

        setInterval(this.show,1000)//定时器

    }

    fn.prototype.show = function(){

        alert(this.a)//fn原型链上的一个方法 弹出a的值

    }

    var obj = new fn();//实例化

    这个时候函数在执行的时候 弹出值为undefined

    为什么那?

    现在我们来看一下这个this 是指向谁的

    function fn(){

         this.a= 1;//fn中的一个属性

          setInterval(this.show,1000)//定时器 弹出值是window

    }

    fn.prototype.show = function(){

          alert(this)

    }

    var obj = new fn();//实例化

    原因就是定时器调用的函数都是指向`window`,所以我们这里弹出的都是`undefined` 因为window上没有`show()`这个方法;

    现在原因找到了怎么解决那,其实很简单;

    我们不要改变他的所属关系就好,就像这样:

    function fn(){

        var _this = this //将我们原来的this赋给_this

        this.a= 1;//fn中的一个属性

       //将原来的方法包一下目的就是不改变他们的所属关系

      setInterval(function(){

           _this.show();

       },1000)//定时器

    }

    fn.prototype.show = function(){

        alert(this.a)//fn原型链上的一个方法  弹出的就是:1

        //因为上面我们已经将this赋给_this了,所以此时this的指向就不在是window了,而是指向了obj

    }

    var obj = new fn();//实例化

    好~~第一种情况我们已经接解决了,下面我们来看第二种情况,,,

    第二种情况:

    面向对象添加了事件的,

    例:这里有一个按钮

    <input id="btn" type="button" value="按钮"/>

    function fn(){

          this.a = 1;

          document.getElmentById('btn').onclick = this.show;

       //弹出值为undefined 此时的this指向是input,而input是没有    show()方法,所以undefined

    }

    fn.prototype.show = function(){

        alert(this.a)

    }

    new fn()

    怎么解决那?

    方法和含有定时器的一样都是在原来的方法外面在套一层 并未把this重新附一下值;

    function fn(){

       var _this = this

       this.a = 1;

       document.getElmentById('btn').onclick = function(){

           _this.show();//弹出值为1

       }

    }

    fn.prototype.show = function(){

       alert(this.a)

    }

    new fn()

    其实这两种情况的解决方式都用到了闭包,

    将函数外面的this给存一下,然后通过闭包传递this

    function fn(){

        var _this = this //存一下this

        this.a= 1;

        setInterval(function(){

            _this.show();//里面调用  

     },1000)

    }

    以上就是个人关于面向对象中的一些看法希望各位看官,多度指正 :>

    相关文章

      网友评论

        本文标题:关于面向对象中this指向问题

        本文链接:https://www.haomeiwen.com/subject/kxyprttx.html