静态属性 static
class Person{
enum Gender{
Male,
Famale
}
static name: string = '熏悟空';// 静态属性 类属性
age: number = 12 // 实例属性
readonly gender: Gender = Gender.Male
}
console.log(Person.name) //类调用
let per = new Person()
console.log(per.age) //实例调用
构造函数
class Dog{
//构造函数会在对象创建时调用
constructor(name: string, age: number){
//this表示当前的实例
this.name = name
this,age = age
}
name: string
age: number
}
const dog1 = new Dog('小白',3)
const dog2 = new Dog('小黑',6)
继承 && super
在继承时,子类的constructor函数中必须调用super,∵如果不调用super,子类的constructor将覆盖父类的constructor操作,继而报错(语法报错)。
在调用super时,必须将父类需要的参数传过去
class Cat{
constructor(name: string, age: number){
//this表示当前的实例
this.name = name
this,age = age
}
name: string
age: number
speak(){
console.log('汪汪汪')
}
}
class Dog{
constructor(name: string, age: number){
//this表示当前的实例
this.name = name
this,age = age
}
name: string
age: number
speak(){
console.log('喵喵喵')
}
}
const dog = new Dog('旺财',13)
const cat = new Cat('咪咪',3)
以上代码中才 Cat 类和 Dog 类的代码过于雷同,可以创建一个父类Animal,Cat,Dog继承Animal即可
class Animal{
constructor(name: string,age: number){
this.name = name
this.age = age
}
name: string
age: number
speak(msg: string): void{
console.log(msg)
}
}
class Dog extends Animal{
//Dog新增的方法
run(){
console.log('狗在跑!')
}
//对父类的speak重写,直接覆盖🚩🚩🚩
speak(){
//super是当前类的父类🚩🚩🚩
super.speak('汪汪汪')
}
}
class Cat extends Animal{
//父类中有constructor,子类也有construcor时,子类必须嗲用super(),
// 因为,如果不调用,子类的constructor将会覆盖父类的constructor操作, 则报错🚩🚩🚩
//调用super时 必须将父类中constructor需要的参数传过去🚩🚩🚩
constructor(name: string,age: number){
super(name, age)//调用父类的constructor
}
}
const dog = new Dog('旺财',13)
const cat = new Cat('咪咪',3)
抽象类 abstract
抽象类不能用来创建对象,抽象类专门用于被继承
抽象类中可以添加抽象方法,抽象方法没有方法体,只能定义在抽象类中,子类必须对抽象方法进行重写
//以上代码中的Animal类即可被定义为抽象类
abstract class Animal{
constructor(name: string,age: number){
this.name = name
this.age = age
}
name: string
age: number
//抽象方法,子类必须重写
abstract speak(): void
}
public:可以在任意位置访问(修改)默认值
private:私有属性,只能在构造函数(类)内部进行访问(修改)
通过在类中添加方法使得私有属性可以被外部方法访问(修改)
protected:受包含的属性,只能在当前类和当前类的子类中访问(修改)
子类继承时,在子类中可以访问,子类的实例对象不能访问
public
class P{
//可以直接将属性定义在构造函数中,不用再写this.name = name ,this.age = age
constructor(public name: string, public age: number){
}
}
//以上代码等同于以下代码
class P{
name: string
age: number
constructor(name: string, age: number){
this.name = name
this.age = age
}
}
private
class Person{
public name: string
private gender: string//私有属性:只能在类内部访问修改,但是外部可以通过类的方法进行间接访问
constructor(name:string, gender:string){
this.name = name
//类内部可以直接访问私有属性,实例对象不能,即per.gender报错
this.gender = gender
}
//通过内部方法将私有属性向外部暴露
getGender(){
return this.gender
}
setGender(value){
this.gender = value
}
}
ts中通过get set 来简化以上代码
class Person{
private name: string
constructor(name:string){
this.name = name
}
get name(){
return this.name
}
set name( val: string ){
this.name = val
}
}
const per = new Person('蜘蛛精')
console.log( per.name )//per.name实际是调用了Person的get name方法
per.name = '猪八戒' // 实际调用Person的 set name方法