ES6中引入了 Class(类)这个概念,作为对象的模板。通过class关键字,用于定义一个类。
官方文档中这样介绍class
ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
简单来说class 的出现可以让我们操作对象的时候更加的简单方便。
用一个例子简单记述一下使用方法
class People{
// 定义一个类 (声明了一个构造函数People)
constructor(name) { //constructor用于接收传递的形参
this.name = name;
}
sayhello() { //在people的对象上挂载一个方法
console.log(`${this.name},hello!`);
}
}
const people = new People("小明")
people.sayhello() // 打印结果为 '小明,hello!'
class 用作继承
class People {
// 定义一个类
constructor(name) { //constructor用于接收传递的形参
this.name = name;
}
sayhello() { //在people的对象上挂载一个方法
console.log(`${this.name},hello!`);
}
}
class Student extends People {
constructor(name, grade) {
super(name) //调用super关键字
this.grade = grade;
}
message() {
console.log(`${this.name},${this.grade}`);
}
}
const student = new Student("小明","五年级")
student.message() // 打印结果为 小明,五年级
student.sayhello() // 打印结果为小明,hello! 继承了People中的sayhello的方法
这里详细说一下 super关键字的作用
super关键字既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。
注意:
1、使用super的时候,必须显式指定是作为函数、还是作为对象使用,否则会报错;
2、由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字。
一、作为函数使用时
当super作为函数调用时,代表父类的构造函数。(ES6要求子类的构造函数必须执行一次super函数,并且只能用在子类的构造函数中)
class A {}
class B extends A {
constructor() {
super();
}
}
这里super代表的是父类A的构造函数,返回的却是子类B的实例,即super内部的this指的是子类B的实例,因此在这里super()相当于A.prototype.constructor.call(this)
二、作为对象调用
class A {
p() {
return 2;
}
}
class B extends A {
constructor() {
super();
console.log(super.p()); // 2
}
}
let b = new B()
1、在普通方法中,super指向父类的原型对象(super指向A.prototype);
(1)、因为super指向的事父类的原型对象,所以定义在父类实例上的方法或属性(即构造器constructor中定义的属性和方法)无法通过super调用。
(2)、在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例,所以如果通过super对某个属性进行赋值,这时super就是this,赋值的属性会变成子类实例的属性。
2、在静态方法中,super指向父类。
在子类的静态方法中通过super调用父类的方法时,方法内部的this指向当前的子类