69 阅读3分钟

一、类定义

1. 定义类有两种主要方式:类声明和类表达式
// 类声明
class Person {}
// 类表达式
const Animal = class {}
2. 类构造函数

constructor关键字用于在类内部创建类的构造函数,意思就是说,在使用new操作符创建类的新实例时,应该去调用这个函数。构造函数的定义不是必需的,不定义构造函数相当于将构造函数定义为空。

3. 类实例化
        // 创建一个类
        class Person {
            // 定义一个构造器,类中的成员由构造器所创建
            constructor(name, age) {
                this.name = name
                this.age = age
            }
            // 定义一个方法
            say() {
                console.log(this.name);
            }
        }

默认情况下,类构造函数会在执行之后返回this对象。构造函数返回的对象会被用作实例化的对象,但是如果没有说明引用新创建的this对象,这个对象就会被销毁。如果在类构造器中返回的不是this对象,那这个构造器返回的对象不会通过instanceof操作符检测出跟类有关联,因为这个实例化对象的原型指针并没有被修改。

// 创建一个类
        class Person {
            // 定义一个构造器,类中的成员由构造器所创建
            constructor(name, age,flag) {
                this.name = name
                this.age = age
                if(flag){
                    return
                    {bar:'bar'}
                }
            }
        }

        let p1 = new Person('jack',18)
        console.log(p1);                        // Person{name:'jack',age:'18'}
        let p2 = new Person('rose',20,true)
        console.log(p2);                        // {bar:'bar'}
        console.log(p2 instanceof Person);      //false
4. 类的继承

4.1 通过extends关键字可以继承父类原型上的成员以及父类的构造器

// 创建一个类
        class Person {
            // 定义一个构造器,类中的成员由构造器所创建
            constructor(name, age,flag) {
                this.name = name
                this.age = age
            }
            // 定义一个方法
            say() {
                console.log(this.name);
            }
        }
        // 创建一个Person派生类,通过extends关键字可以继承父类的构造器以及父类原型上的成员
        class Student extends Person {
        }
        let stu = new Student('jack', 18)
        // 通过extends关键字可以继承父类的构造器
        console.log(stu);
        // 通过extends关键字可以继承父类原型上的成员
        stu.say()

4.2 使用super调用父类构造函数

// 创建一个类
        class Person {
            constructor() {
                // 谁调用指向谁
                console.log(this);
            }
        }
        // 创建一个Person派生类,通过extends关键字可以继承父类的构造器以及父类原型上的成员
        class Student extends Person {
            constructor() {
                // 通过super可以调用父类的构造器
                super()
            }
        }
        let stu = new Student()

在上面的代码中,子类Student通过super调用了父类的constructor构造器,使Person构造器中的this指向了Student类。所以我们可以通过调用父类的构造器来为子类Student创建实例化对象。注意:不要在调用super()之前引用this,否则会报错

// 创建一个Person派生类,通过extends关键字可以继承父类的构造器以及父类原型上的成员
        class Student extends Person {
            constructor(name, age, gender) {
                // 通过super调用父类的构造器为自己添加成员
                super(name, age)
                this.gender = gender
            }
        }
        let stu = new Student('jack', 18, '男')
        console.log(stu); //   {age: 18,gender: "男",name: "jack"}