ES6(1)(2)总结

类与实例化以及this的指向问题

以上两章讲解了类和对象,这一章总结一下类和对象
(本次内容的代码都为一个模板,注意不要混淆)
三个注意点:
1.ES6中类没有变量提升,所以先定义类,然后再能通过类进行实例化对象。

   class School{
        constructor(sname,special){
            this.sname=sname
            this.special=special
        }
        teach(){
            console.log('学习中')
        }
    }

以上代码先定义了类

    var beida=new School('北京大学','中文系')
    beida.teach()

然后实例化并执行,成功出现‘学习中’说明实例化成功了
如果把此段代码实例化放在class前面,就会出现运行错误提示:Uncaught RefenceError: School is not define,也就是SChool没有被定义,那怎么实例化呢
2.类里面的共有属性和方法一定要加this使用

class School{
        constructor(sname,special){
            this.sname=sname
            this.special=special
        }
        teach(){
            // console.log(sname)
            console.log(this.sname)
        }
    }
    var beida=new School('北京大学','中文系')
    beida.teach()

注释掉的那一行代码运行后会提示错误:没有定义这个sname,对于teach这个方法确实没有sname这个参数,但是我们想要的是实例化对象里面的sname,刚好this指向的就是实例化对象,所以我们应该this.sname,是哪一个实例化对象的名字呢,这里也就是北京大学的名字。
同样再举个例子

    class School{
        constructor(sname,special){
            this.sname=sname
            this.special=special
            // teach()这种调用方法在此处是错误的
            this.teach()
        }
        teach(){
            console.log(this.sname)
        }
    }
    var beida=new School('北京大学','中文系')

不想在外面调用teach方法了,让她一实例化就自动调用此方法,首先把调用方法写在constructor函数里自动执行,teach方法是属于这个类里面的,我们要告诉他是实例化对象要调用这个方法,所以this.teach()。
接下来体会更深一点,添加一个按钮,点击按钮调用这个方法

    <button>teach</button>
    <script>
    class School{
        constructor(sname,special){
            this.sname=sname
            this.special=special             
            //赋予btn并且实例化给对象,还要把获取到的标签赋给btn      
            this.btn=document.querySelector('button')
            this.btn.onclick=this.teach
        }
        teach(){
            // console.log('学习中')
            console.log(this.sname)
        }
    }
    var beida=new School('北京大学','中文系')

当前实例化对象里btn被点击所以还是加this,然后调用teach方法,同样这个方法是类里面的,也要实例化对象来调用此方法,所以还是this.teach,注意这个地方不加括号,加了括号就是自己调用,但是这里需要的是点击再调用。当然,我们点击完之后控制台打印出的是undefine没有定义,这就是我们下一个注意的问题类里面this的指向问题。
3.类里面this的指向问题
类里面constructor以及方法里面都有this,那我们一个一个来看。之前说过constructor的作用是创建一个实例,所以constructor里面的this指向的是正在创建的实例对象,下面代码验证一下

class School{
        constructor(sname,special){
            console.log(this)//直接打印constructor里面的this
            this.sname=sname
            this.special=special
            this.btn=document.querySelector('button')
            this.btn.onclick=teach
        }
        teach(){
            // console.log('学习中')
            console.log(this.sname)
        }
    }
    var beida=new School('北京大学','中文系')
    var qinghua=new School('清华大学','英语系')

在这里插入图片描述
指向的是我们的类School,也就是说指向由我们类创建的一系列实例,站在beida实例的角度来看,constructor里面的this是指向这个beida实例的,但是站在类的角度看,指向的是每一个被这个类实例化的对象,总之就是,constructor里面的this指向的是正在创建的实例对象。
接着方法里的this指向谁呢,结合以下代码在此新建一个方法打印一下this,并且定义一个中间变量that,最后beida调用learn()这个方法后,再打印一下that与实例化对beida是否全等,如果结果为true,说明方法里面this指向的还是它的调用者。

   var=that
   class School{
        constructor(sname,special){
            console.log(this)
        }
        learn(){
            that=this
            console.log(this)
        }
    }
    var beida=new School('北京大学','中文系')
    beida.learn()
    console.log(that===beida)

不仅输出了School类里面实例化对象beida也输出true(不放图了可以自己试一试),也就是说因为beida调用了这个方法,所以这里this指向的是实例化对象beida。
这里还有一个teach方法里的this指向,首先我们知道是属性btn调用了teach这个方法,谁调用了这个方法,方法就指向这个对象,看以下代码和结果:

    class School{
        constructor(sname,special){
            // console.log(this)
             this.sname=sname
             this.special=special
             this.btn=document.querySelector('button')
             this.btn.onclick=this.teach
        }
        teach(){
            // console.log('学习中')
            console.log(this)
            console.log(this.sname)
            
        }
    }
    var beida=new School('北京大学','中文系')

在这里插入图片描述
这样我们也解决了第二个注意里为什么会出现undefined,因为点击属性btn调用teach方法,因此teach方法里的this指向的是btn,但是btn没有sname这个属性,所以出现结果undefined。那下面我们解决一下这个问题,前面我们添加了一个变量that来验证this的指向问题,所以这里我们也用这个变量来解决:

    var that
    class School{
        constructor(sname,special){
             that=this
             this.sname=sname
             this.special=special
             this.btn=document.querySelector('button')
             this.btn.onclick=this.teach
        }
        teach(){
            console.log(this)
            console.log(that.sname)//that存储的是constructor实例化对象的this
            
        }
    }
    var beida=new School('北京大学','中文系')

因为that=this,that里面存储的就是constructor实例化的对象beida,所以点击btn调用的teach方法里所打印的sname就变成了实例化对象beida的名字,这样就解决了undefined,出现‘北京大学’。
最后再写一下总结:
1.ES6中类没有变量提升,所以先定义类,然后再能通过类进行实例化对象。
2.类里面的共有属性和方法一定要加this使用
3.类里面的指向问题(constructor里面的this指向实例对象,方法里面的this指向这个方法的调用者)
阅读过程中有其他疑问,可以一起讨论,噢耶(o)/

发布了3 篇原创文章 · 获赞 10 · 访问量 1776

猜你喜欢

转载自blog.csdn.net/weixin_46533954/article/details/105297964