JS中类常用基础知识精解

134 阅读2分钟

创建一个Person类

  class Person {
      //构造器方法
      constructor(name,age){
          this.name = name;
          this.age = age;
      }
      //一般方法
      speak(){
          console.log(`我叫${this.name},我年龄是${this.age}`);
      }
  }

上述代码所引发知识点及其精解

 const person_first = new Person(托尼, 30);
 const person_second = new Person(帕克, 25);

问题 1: 请问上述class构造器中的this是谁?

答:this指的就是类的实例对象。

问题 2: speak方法放在了哪里?

答:类的原型对象上(后续会详解,大家先略过),一般情况下,供实例使用。

问题 3: 这里的this指向是谁? 答:分2种情况回答此问题。

  • 第一:如果通过Person实例调用speak时,speak中的this就是Person实例
  • 第二:举个例子哈,请看下面代码语句
  const person_three = new Person(思雨, 92);
  person_three.speak.call({name: '小玉'age: 94});

此时this指的就是{name: '小玉', age: 94}, 因为call的作用之一就是可以改变this的指向,通过call调用person_three.speak函数之后 ,this指向发生了变化。

创建一个Student类,继承于Person类

    class Student extends Person {
        constructor(name,age,grade){
            super(name,age);
            this.grade = grade;
        }
        speak(){
            console.log(`我叫${this.name},我年龄是${this.age},我读的是${this.grade}年级`);
            this.study();
        }
        study(){
            console.log(this + '我很努力的学习');
        }
    }

上述代码所引发知识点及其精解

问题1 创建的Student类,继承Person类。如果自定义属性如何添加?

答: constructor(name,age,grade){ super(name,age); // 必须调用super, class规定,并且放在自定义属性语句之前 this.grade = grade; }

问题2 study方法放在了哪里?

答: 类的原型对象上,供实例使用,通过Student实例调用study时,study中的this就是Student实例,如果通过call,bind等 即可改变下面红色箭头this的指向。

问题3 如何重写从父类继承过来的方法?

总结

  • 类中的构造器不是必须要写的,要对实例进行一些初始化的操作,如添加指定属性时才写。

  • 如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须要调用的。

  • 类中所定义的方法,都放在了类的原型对象上,供实例去使用。