什么是类?
1、类是面向对象编程语言的通用结构。2、类是一种结构:将现实世界中存在的关系,采用一种{}的形、式,将各种数据和数据的操作捆绑到一起:外界不需要知道里面到底是怎么实现的,只需要调用里面提供的可操作的方法(封装)。
3、比原型方式要简洁的多,结构层面更加清晰。
语法操作
类class是ES6的新特性
类的语法:class 类名 {}
类名不能重复
.类不会自动运行:需要new的时候才会触发
.只要对象产生:new出一个对象:里面的构造器就会被触发
方法实现
类里面的方法:方法名 + () + {},不需要function关键字(代表当前方法挂载Student.prototype)
类实例化得到的对象,可以直接调用方法
代码:
// function Student(name){
// this.name=name
// }
// 直接通过class进行类的创建
class Student{//当用户new Student对象的时候:new出来的对象会自动调用的方法
constructor(name,age){//创造属性:this永远代表对象
this.name=name
this.age=age
}
eat(){
console.log(this.name+"正在吃")
}
}
let s1=new Student("王一",21)// 构造器被调用了:只要有new对应的类就会被触发,产生一个对象 -- 实例化
s1.eat()
类的继承extends
子类继承父类:extends关键字
继承效果:子类对象可以访问父类中提供的属性或者方法
class People{
constructor(name,age){
this.name=name
this.age=age
console.log("我是父类构造器")
}
eat(){
console.log(this.name+"正在吃")
}
}
//继承 extends 父类
class Student extends People{
}
// 实例化子类对象
let s1=new Student("王一",21)// 调用类构造器(父类的:继承得来的)
s1.eat()
子类的属性如果与父类重名:会替换掉。
子类的方法如果与父类重名:在使用的时候只能访问到自己,如果非要访问父类的,必须使用super()。
1、普通方法的覆盖,super.父类被覆盖的方法()
class Father {
name = 'father';
sa() {
console.log(this.name);
}
}
class Sun extends Father {
name = 'sun'; // 属性的覆盖----替换,内存中只有一个name属性:值为sun
// 方法重写
sa() {
// 需要在子类的方法中使用super.被子类覆盖的方法sa()
super.sa(); // 调用父类(方法存在于原型:Son和Father的原型不同,所以不可能覆盖)
}
}
// 实例化:子类
let s = new Sun();
s.sa();
super()方法:父类的构造函数
子类是可以重构父类的
class People{
constructor(name,age){
this.name=name
this.age=age
}
eat(){
console.log(this.name+"正在吃")
}
}
//继承 extends 父类
class Student extends People{
//super()方法:父类的构造函数
constructor(name,age,height){
// 父类有构造方法:那么子类的构造方法必须先访问父类的构造方法
super(name,age)
// 只要在构造方法使用this之前调用父类的构造方法就可以运行代码
this.height=height
}
//子类是可以重构父类
eat(){
console.log("子类重构了")
}
}
let s1=new Student("王一",21,189)
s1.eat()
console.log(s1)
1、 继承之后,如果子类中没有定义,就会沿用父类中的方法或属性
2、子类对父类的方法和属性可以进行重构和重载
3、 但是,如果是继承的父类中有定义构造函数, 就必须加一个super(),然后接着添加子类的构造方法,不能将父类中的构造函数覆盖
4、super()是对父类构造器的一个引用,相当于父类中的constructor()方法直接写入到了子类中