概念:
class类是es6的一种构造函数语法糖写法。
创建一个class类
class myClass{
//构造器,默认为空的构造器
//当class在被new时就会调用构造器
//相当于function
//function myClass(name,age){
// this.name=name
// this.age=age
//}
//
//name : string; //类的属性
//age:string
constructor(name,age){ //这些都是实例属性 //只有实例才能访问 this.name=name this.age=age } }
//类的方法
greeting() {};
//定义于 constructor 内的属性和方法,即定义在 this 上,属于实例属性和方法,否则属于原型属性和方法。在TypeScript中,是不允许直接在constructor中定义变量的,需要在constructor上面先声明。
使用 class 定义类,使用 constructor 定义构造函数。通过 new 生成新实例的时候,会自动调用构造函数。
创建类实例对象
var i=new myClass('小明',18)
类的继承
使用 extends 关键字实现继承,子类中使用 super 关键字来调用父类的构造函数和方法(super需要同步父类的参数个数?)
//动物类 class AnimalClass { private name : string; public constructor(theName:string){ this.name = theName; }; public move(movedistance : number = 0){ console.log(`${this.name} 移动的距离是 ${movedistance}`); }; } //蛇继承了动物类 class Shake extends AnimalClass{ constructor(name : string){ super(name); //初始化父类 // 如果在子类中写了构造函数,相当于重写了父类的构造函数。 // 在子类构造函数中必须对父类的构造函数进行调用, // 否则父类的构造函数不会执行 }; move(movedistance:number =5){ console.log("Shake..."); super.move(movedistance); } } //马继承了动物类 class House extends AnimalClass{ constructor(name : string){ super(name); }; move(movedistance:number =10){ console.log("House..."); super.move(movedistance); // 在类的方法中super就表示调用当前类的父类方法 } } let shake = new Shake("蛇"); let house : AnimalClass = new House("马"); shake.move(); // 多态 house.move(50); // 多态
修饰符
typeScript 可以使用三种访问修饰符(Access Modifiers),分别是 public、private 和 protected。
public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的
class AnimalClass { //只有当前类可以访问 private _animalName : string; public constructor(theName:string){ this._animalName = theName; }; //子类可以访问 protected move(movedistance : number = 0){ console.log(`${this._animalName} 移动的距离是 ${movedistance}`); }; private jump(distance : number = 0){ console.log(`${this._animalName} jummp ${distance}`); } // getter setter存取器 set animalName(aName : string){ this._animalName = aName; } get animalName(){ return this._animalName; } }
静态方法、静态属性
使用 static 修饰符修饰的方法称为静态方法,它们不需要实例化,而是直接通过类来调用
class Animal { //静态属性 static num = 42; //静态方法 static isAnimal(a) { return a instanceof Animal; } } let a = new Animal('Jack'); Animal.isAnimal(a); // true a.isAnimal(a); // TypeError: a.isAnimal is not a function console.log(Animal.num); // 42
实例方法和属性
ES6 中实例的属性只能通过构造函数中的 this.xxx 来定义,ES7 提案中可以直接在类里面定义
class Animal { //实例属性 name = 'zibin'; constructor() { // ... } } //实例方法 run() {}; let a = new Animal(); console.log(a.name); // zibin
一.继承
1)、class 可以通过extends关键字继承父类的所有属性和方法。
2)、子类构造函数中使用super关键字调用父类的构造函数,this操作不能放在super前面。
3)、在子类中可以通过设置与父类同名的属性或方法覆盖父类的属性或方法。
二.总结super的不同用法
super,可以作为函数调用,也可以作为对象使用。
作为函数调用,只能用在子类的构造方法中(调用父类的构造方法),用在其他地方会报错。super虽然代表了父类的构造方法,但是内部的this指向的是子类的实例。
作为对象使用,在构造方法中使用或一般方法中,super代表父类的原型对象prototype。可以通过super调用父类的方法。定义在父类实例上的方法和属性是无法通过super使用的。通过super调用父类的方法时,方法内部的this指向当前的子类实例。在静态方法中使用,super代表父类,而不是父类原型对象。通过super调用父类的方法时,方法内部的this指向当前的子类,而不是子类实例。
三.注意事项:
使用super的时候必须显式指定式作为函数还是对象使用,否则会报错。
super作为函数调用时,代表父类的构造函数,super中的this指向的是子类的this;非静态方法中,指向父类的原型对象;在静态方法中,指向父类
子类继承父类时,可以不写super
当子类继承父类时,如果不需要通过constructor设置属性和继承父类constructor中的属性,那么就可以不写constructor和super,否则,就必须写上constructor和super。
文献:es6 Class类的理解 - SE7EN_96 - 博客园 class类 的理解_麦子穗的博客-CSDN博客_谈谈你对class类的理解