目录

一、类

二、多态(一个对象多种形态)

三、抽象类

四、访问修饰符

readonly修饰符


一、类

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