Typescript 类与继承
- 类
- 构造函数
- 继承
类
Typescript 使用class关键字来定义一个类
类中直接定义的属性是实例属性,需要通过对象的实例去访问;使用static
开头的属性是静态属性(类属性),可以直接通过类访问。
readonly 为只读属性,不可以进行修改。readonly
和static
如果想要同时出现的话,readonly
需要放在后面。
//使用class关键字来定义一个类
class Person{
//定义实例属性
//直接定义的属性是实例属性,需要通过对象的实例去访问
//使用static开头的属性是静态属性(类属性),可以直接通过类访问
name:string = '贾宝玉';
static age:number = 18;
readonly sex:string = 'man';//只读属性,不能修改
//readonly 和static如果想要同时出现的话,readonly需要放在后面
//定义方法
sayHello(){
console.log('Hello 大家好!');
}
}
const per = new Person();
console.log(Person.age);//18
console.log(Person.name);//输出为Person
// console.log(per.name);
per.name = '贾琏';
console.log(per.name);//npu
// per.sex = 'female';//报错
构造函数
constuctor被称为构造函数,会在对象创建时调用,在实例对象方法中,this就表示当前的实例,在构造函数中当前对象就是当前新建的那个对象,可以通过this向新建的对象中添加属性。
class Dog{
name:string;
age:number;
//constuctor被称为构造函数,会在对象创建时调用
constructor(name:string,age:number){
//在实例对象方法中,this就表示当前的实例
//在构造函数中当前对象就是当前新建的那个对象
//可以通过this向新建的对象中添加属性
this.name = name;
this.age = age;
}
bark(){
//可以通过this来表示来抢调用方法的对象
alert('汪汪');
console.log(this.name);
}
}
const dog = new Dog('小黑',2);
console.log(dog);
dog.bark();
继承
继承是面向对象编程中讨论最多的话题。abstrac 开头的类是抽象类,不能用来创建对象,就是专门用来被继承的类,抽象类中可以添加抽象方法,抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写。
ts 中 extends 可以理解为 es6 class 对应的 extends。通过继承可以将多个类中共有的代码写在同一个父类中,这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法,如果希望在子类中添加一些父类中没有的属性或方法直接加就可以了。如果在子类中添加了和父类相同的方法时,则子类方法会覆盖掉父类的方法,我们称为方法重写。
注意:子类中新增属性的话,构造函数中必须要有super。
//由于ts在不同文件夹中声明相同的类会报错,我们将代码写在自执行函数中
(function(){
//定义父类(也可以称为超类)Animal
//abstrac 开头的类是抽象类,不能用来创建对象,就是专门用来被继承的类
//抽象类中可以添加抽象方法,
abstract class Animal{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
//抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
abstract sayHello():void;
// sayHello(){
// console.log('动物在叫');
// }
}
//定义子类,并继承父类的所有方法和属性
//通过继承可以将多个类中共有的代码写在同一个父类中,
//这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法
//如果希望在子类中添加一些父类中没有的属性或方法直接加就可以了
class Dog extends Animal{
run(){
console.log(`${this.name}在跑`);
}
//如果在子类中添加了和父类相同的方法时,则子类方法会覆盖掉父类的方法,我们称为方法重写
sayHello(){
console.log('汪汪');
}
}
class Cat extends Animal{
//子类中新增属性的话,构造函数中必须要有super
sex:string;
constructor(name:string,age:number,sex:string){
super(name,age);//调用父类的构造函数
this.sex = sex;
}
sayHello(){
//在类的方法中super就表示当前类的父类
// super.sayHello()
console.log('喵喵喵');
}
}
const dog = new Dog('旺财',5);
const cat = new Cat('咪咪',3,'女');
dog.sayHello();
console.log(dog);
cat.sayHello();
console.log(cat);
dog.run();
})();