一、类定义
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"}