构造函数
一般我们一个类会创建多个对象,并且希望这些对象的属性各不相同,这时我们就用到了class中的构造函数 constructor
在构造函数中当前对象就是当前新建的那个对象,那么此时我们就可以通过this向新建的对象中添加不同的属性
eg:
class Dog{
names:string;
age:number;
constructor(name:string,age:number){
// 在实例方法中,this就表示当前实例
// 在构造函数中当前对象就是当前新建的那个对象,那么此时我们就可以通过this向新建的对象中添加不同的属性
console.log(this);
this.names = name;
this.age = age;
}
bark(){
alert("汪汪")
}
}
const dog1 =new Dog("旺财",2);
const dog2 =new Dog("大黄",3);
console.log(dog1,dog2)
dog1.bark();// Dog {names: '旺财', age: 2}
dog2.bark();// Dog {names: '大黄', age: 3}
类的继承
extends 继承 此时 被继承者 被称为父类 继承者被称为子类 ;
使用继承后,子类中将会拥有父类的所有属性和方法;
通过继承我们可以将多个类中共有的代码写在一个父类中,实现代码复用;
如果希望在子类中添加一些父类中没有的方法或属性,直接加就行;
如果在子类中添加了和父类相同的方法,则子类中的方法会覆盖掉父类中方法,这种形式我们称为方法重写;
在类方法中super就表示当前类的父类 super常用于在子类中添加父类中没有的属性;
若在子类中写了构造函数时,就必须对父类中的构造函数进行调用;
以abstract开头的类为抽象类,抽象类何其他类区别不大,只是不能用于创建对象,一般我们希望公共的父类只用于被子类继承而不是用父类创建对象,故父类一般都使用抽象类;
抽象类中可以添加抽象方法 只需在方法前添加 abstract 如:abstract say():any;
抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写 !
eg:
abstract class Animal{
name:string;
type:string;
say:string;
constructor(name:string,type:string,say:string){
this.name=name;
this.type=type;
this.say=say;
}
bark(){
console.log(this.type+this.name+"在"+this.say+"叫")
}
}
class Dog extends Animal{
// 此处需要将父类所需参数再传一遍
constructor(name:string,type:string,say:string,age:number){
super(name,type,say)
}
run(){
console.log(this.name + "在跑")
}
bark(){
console.log("狗")//狗
}
}
class Cat extends Animal{
sleep(){
console.log(this.name + "在睡觉")
}
bark(){
super.bark();//小猫咪咪在喵喵叫
}
}
const WC = new Dog("旺财","小狗","汪汪",2);
const MM = new Cat("咪咪","小猫","喵喵");
WC.bark();//小狗旺财在汪汪叫
WC.run();//旺财在跑
MM.bark();//小猫咪咪在喵喵叫
MM.sleep();//咪咪在睡觉