注意1:在 class 的 { } 区间内,只能写 构造器、静态方法、静态属性、实例方法;
注意2:class 关键字内部,还是用的原来的配方实现的,所以说,class 关键字,称作为 语法糖;
class-继承
在class 类中, 通过使用 extends 实现继承的
语法:class A extends B { }
//这是父类【大家可以直接把父类理解成原型对象 prototype】
class Person{
constructor(name,age){
this.name=name;
this.age=age;
}
//共同的打招呼实例方法
sayHello(){
console.log('大家好!!!')
}
}
//这是子类,美国人
//在 class 类中,可以使用 extends 关键字,实现子类继承父类
class American extends Person{
}
const a1 = new American('Jack',20);
console.log(a1);
a1.sayHello();
//子类,中国人
class Chinese extends Person{
}
const c1 = new Chinese('张三',22);
console.log(c1);
c1.sayHello();
子类中constructor构造器中的super函数的使用
问题1:为什么一定要在 constructor 中调用 super ?
答案1:因为如果一个子类,通过 extends 关键字继承了父类,那么,在子类的 constructor 构造器中,必须 优先 调用一下 super()
问题2:super 是个什么东西?
答案2: super 是个函数,而且 ,它是 父类的 构造器;子类中的 super ,其实就是父类中,constructor 构造器的一个引用
问题3:为什么 调用了 super() 之后,a1 实例的 name 和 age 都变成了 undefined 了?
答案: 因为super 是父类 constructor 构造器的一个引用,没有对应的参数传过去,所以就是 undefined了。
注:如果 不在子类中写,constructor 构造器,那么默认会把参数传给父类;如果写了,看下边一步步传参图解
class Person{
constructor(name,age){
this.name=name;
this.age=age;
}
//共同的打招呼实例方法
sayHello(){
console.log('大家好!!!')
}
}
class American extends Person{
constructor(name,age){
super(name,age)
}
}
const a1 = new American('Jack',20);
console.log(a1);
a1.sayHello();
class Chinese extends Person{
constructor(name,age){
super(name,age)
}
}
const c1 = new Chinese('张三',22);
console.log(c1);
c1.sayHello();
图解:
注意事项
// 子类,中国人
class Chinese extends Person {
// 如果不写constructor,默认会把两个参数传给父类,写的话,要自己传参
constructor(name, age, IDNumber) {
// name 姓名,age 年龄, IDNumber 身份证号【中国人独有】这个不是个挂到父类
super(name, age)
// 必须放到 super 后
this.IDNumber = IDNumber
}
}
注意: 一定 要 优先 调用 super 函数,任何操作都要放到 super 函数后边!!!