1、什么是类
-
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类;
-
class 的本质是 function;
-
它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法;
-
类不可重复声明;
-
类定义不会被提升,这意味着必须在访问前对类进行定义,否则就会报错;
-
类里面默认就是严格模式。
2、类的主体
(1)属性: ES6的类中不能直接定义变量,变量被定义在constructor中。
class People {
//a = 10;
constructor() {
this.a = 100; //定义变量
}
}
let p = new People();
console.log(p.a);
(2)方法:
constructor 方法是类的默认方法,创建类的对象时被调用。也被称为类的构造方法(构造函数、构造器)。一个类中有且仅有一个构造方法。
class People {
constructor() {
console.log("我是构造方法,使用new创建对象时才调用");
}
}
new People(); //执行constructor方法
原型方法:不需要使用function关键字,通过--对象.方法--调用。
class People {
say(c) {
console.log(c);
}
add(a, b) {
console.log(a + b);
}
}
let p = new People();
p.say("hello"); // hello
p.add(1, 2); //3
静态方法:使用static修饰,调用时不需要创建对象,直接通过--类名.静态方法--调用
class People {
static sum(a, b) {
console.log(a + b);
}
}
People.sum(1, 2);
3、类的继承
-
解决代码的复用
-
使用extends关键字实现继承
-
子类可以继承父类中所有的方法和属性(构造方法不能被继承)
-
子类只能继承一个父类,一个父类可以有多个子类(单继承)
-
类中如果不写构造方法,会自动产生无参的构造方法,子类任然要使用super()来调用
-
子类构造方法如果没有写出来,子类会自动产生无参的构造方法,并且方法体中用一个super()语句
-
创建子类对象的过程:
(1)创建父类对象
(2)再追加子类对象空间
(3)子类构造方法自动执行,子类构造方法中使用super()调用父类构造方法,super()位于this使用之前
(4)返回子类对象的引用
class People {
//父类构造方法
constructor() {
this.a = 100; //父类中定义的变量
console.log("People constructor");
}
//原型方法
eat() {
console.log("eat...")
}
//静态方法
static play() {
console.log("play...")
}
}
class Student extends People {
//子类构造方法
constructor() {
super(); //调用父类构造器,必须存在,且位于子类构造器第一行的位置
this.b = 200; //子类定义的变量
console.log("Student constructor");
}
study() {
console.log("study...");
}
}
let stu = new Student();
console.log(stu.a, stu.b);
stu.eat();
stu.study();
Student.play();
重写:子类中如果有与父类相同的方法和属性,将会优先使用子类的(覆盖)
class Person {
walk() {
console.1og("走路");
}
}
class Girl extends Person {
//重写方法
walk() {
consple. 1og("走猫步");
}
}
class Man extends Person {
}
Let g=new Girl();
g.walk();//走猫步
Let m = new Man();
m.walk();
4、super
super既可以作为函数使用又可以作为对象使用,在这两种情况下,它的用法完全不同
情况一:super作为函数使用时,代表的是父类的构造函数,调用后返回的是子类的实例(super内部的this指向子类的实例)
注意只能在子类的构造函数中调用
情况二:super作为对象使用
1.在普通方法中,super指向父类的原型对象,super调用的方法中的this指向子类的实例
2.在静态方法中,super指向父类,super调用的方法中的this指向子类