目录
一、类
javascript关于类的侧重点主要是原型对象
面向对象类-->类是创建对象的模板,一个类可以创建多个对象
class Person{
foo(){}
bar(){}
}
let p1=new Person()
p1.var()
p1.foo()
二、多态(一个对象多种形态)
多态存在的三个条件:
(1)存在继承
(2)子类实现对父类方法的重写
(3)父类类型的引用指向子类对象
继承使用extends关键字;
重写:如果子类方法与父类一致,子类会对父类的方法进行重写;
父类类型的引用指向子类对象,通过该引用可以访问到父类的特性(属性、方法),但是无法访问子类得特性;如果子类对父类的特性进行重写,通过该引用调用的重写特性依旧为子类特性。
class Person{
name:string;
age:number;
weight?:number;
say():void{
console.log('hello person');
}
}
// 子类继承了父类
class Student extends Person{
stuNo:string;
// 子类对父类方法进行重写
say():void{
console.log('hello student');
}
// 子类还可以有自己的方法
study():void{
console.log('好好学习,天天向上');
}
}
// 父类类型的引用指向子类对象 => 多态
let s1:Person=new Student();
// s1可以调用父类对象的属性、方法
s1.age=12;
s1.name='terry';
// 子类对父类方法重写,会调用子类的方法
s1.say(); //hello student
// 实例s1无法调用子类对象的属性、方法
// s1.stuNo='1002';
// s1.study()
//打印s1可以看出 父类类型的引用指向子类对象,因为前面显示的是Student
console.log(s1);//Student { age: 12, name: 'terry' }
三、抽象类
什么是抽象类? 一般情况下,抽象类无法创建对象,抽象类中可以存在抽象方法(也可以不存在抽象方法),抽象方法指的是没有方法体的方法。
抽象类中可以存在抽象方法和非抽象方法,一个类中具有抽象方法,那么该类一定是抽象类 。
抽象类存在的意义?为了让其它类继承抽象类,并强制要求子类实现抽象方法。
子类继承抽象类的两种方式:
1、子类必须实现抽象类中的方法
2、子类成为抽象类
// 使用abstract关键字
abstract class Person {
//抽象方法(没有方法体{})
abstract study(): void;
log(): void {
console.log('我不是抽象方法');
};
}
// 子类继承抽象类 两种方式:
// 1.实现抽象类中方法study
class Student extends Person {
study(): void {
console.log('好好学习,天天向上');
}
// 还可以有自己的方法
cook(): void {
console.log('学会了做饭');
}
}
let s3: Student = new Student();
s3.study();//好好学习,天天向上
s3.cook();//学会了做饭
s3.log();//我不是抽象方法
// 2.自身也成为抽象类
// abstract class Student2 extends Person1{
// }
四、访问修饰符
public 表示共有的,可以在当前类、子类、其他类进行访问
protected 表示保护的,可以在当前类、子类进行访问
private 表示私有的,只能在当前类中访问
readonly修饰符
你可以使用 readonly
关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。
class Person {
public name: string;
protected age: number;
private weight: number;
readonly gender: string;
constructor(name, age, weight, gender) {
this.name = name;
this.age = age;
this.weight = weight;
this.gender = gender;
}
protected foo() {
console.log(this.name);
console.log(this.age);
console.log(this.weight);
}
}
class Student extends Person {
constructor(name, age, weight, gender) {
super(name, age, weight, gender);
}
bar() {
// super 是父类的引用
super.foo()
}
};
let s1: Student = new Student('zhangsan', 12, 40, 'male');
console.log(s1.name);//zhangsan
// gender是只读属性,不可修改
// s1.gender='female';
s1.bar();//zhangsan 12 40