Class

Class 基本用法

  • 格式
 // 1.声明形式
      class Person {
        constructor() {}
        speak() {}
      }
      // 2.表达式形式
      const Person = class {
        constructor() {
          console.log('constructor');
        }
        speak() {}
      };
      new Person();
  • 类名首字母一般大写
  • 实例化时执行构造方法,所以必须有构造方法contructor,但可以不写出来
  • this 代表实例对象,上面定义的是实例属性/方法
  • 一般在构造方法中定义属性,方法不在构造方法中定义

Class的属性和方法

  1. 实例属性 方法就是值为函数的特殊属性。
 class Person {
          // 属性是添加到实例对象上的
            age = 0;
            sex = 'male';
            // 添加到类的原型对象上
            getSex = function() {
                return this.sex;
            };
            constructor(name, sex) {
              // 添加到实例对象上
                this.name = name;
                this.sex = sex;
            }
        }
        const p = new Person('Alex', 'male');
  1. 静态方法 添加到类本身上
  • 使用static关键字
 class Person {
            static getSex = function() {
                return this.sex;
            };
            constructor(name) {
                this.name = name;
            }
        }
        const p = new Person('Alex');
  • 直接在类上添加
 class Person {
            constructor(name) {
                this.name = name;
            }
        }
        Person.getSex = function() {
          return this.sex;
        }
        const p = new Person('Alex');
  1. 静态属性 与静态方法使用方式一致
  2. 私有属性和方法 : 一般情况下,类的属性和方法都是公开的 ,公有的属性和方法可以被外界修改,造成意想不到的错误
    • _ 开头表示私有
    • 将私有属性和方法移出类

Class的继承

  1. 使用exends关键字实现继承,同名属性子类覆盖父类
class Person {
        constructor(name, sex) {
          this.name = name;
          this.sex = sex;
          this.say = function () {
            console.log('say');
          };
        }
        speak() {
          console.log('speak');
        }
        static speak() {
          console.log('static speak');
        }
      }
      Person.version = '1.0';
      class Programmer extends Person {
        constructor(name, sex) {
          super(name, sex);
        }
      }
  1. super关键字
  • super前方不可以有this操作


    image.png
  • 作为函数调用
    1)代表父类的构造方法,只能用在子类的构造方法中,用在其他地方就会报错
    2)super 虽然代表了父类的构造方法,但是内部的 this 指向子类的实例

  • 作为对象使用
    1)在构造方法中使用或一般方法中使用 super 代表父类的原型对象 Person.prototype

 // 定义在父类实例上的方法或属性,是无法通过 super 调用的
  // 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类实例
class Person {
        constructor(name) {
          this.name = name;
          console.log(this);
        }
        speak() {
          console.log('speak');
        }
        static speak() {
          console.log('Person speak');
          console.log(this);
        }
      }
      class Programmer extends Person {
        constructor(name, sex) {
          super(name, sex);
        }
        speak() {
          super.speak();
          console.log('Programmer speak');
        }
      }

2)在静态方法中使用, 指向父类,而不是父类的原型对象

 // 指向父类,而不是父类的原型对象
        // 通过 super 调用父类的方法时,方法内部的 this 指向当前的子类,而不是子类的实例
      class Person {
        constructor(name) {
          this.name = name;
          console.log(this);
        }
        speak() {
          console.log('speak');
        }
        static speak() {
          console.log('Person speak');
          console.log(this);
        }
      }
      class Programmer extends Person {
        constructor(name, sex) {
          super(name, sex);
        }
        static speak() {
          super.speak();
          console.log('Programmer speak');
        }
      }
  • 注意事项 : 使用 super 的时候,必须显式指定是作为函数还是作为对象使用,否则会报错

你可能感兴趣的:(Class)