ts之类部分

146 阅读3分钟

基本使用

class Person{
    name:string;
}
let p = new Person()
console.log(p)   //Person{}

p的类型就是person

通过new 一个类 那么p就是一个对象

构造器

  class Person{
    name:string;
    constructor(name){
        this.name = name
    }
}
let p = new Person('wangcai')
console.log(p.name)   //wangcai
let p1 = new Person('xiaoqiang')
console.log(p1.name)   //xiaoqiang

当new一个类时,会自动调用constructor,把wangcai传入到constructor中的name,this代表当前new这个类的对象,它是不固定的

当new这个类时,那么每一个对象上面都有一个name属性

三个权限

public

代表是公有的,在所有类的类内类外都可以访问到,不写权限的时候,默认都是public

class Animal{
   public name:string;
    constructor(name){
        this.name = name
    }
}
let p = new Animal('pig')
console.log(p.name)

private

私有的,只能在自己类的内部访问到,所以这时候需要使用访问器(公共的方法),这时候会在所有的类内类外访问

class Animal{
    private _name:string;
     //构造器
     constructor(name){
         this._name = name //只能在自己内部使用
     }
     //访问器
     public get name():string{
         return this._name
     }
     //修改器
     public set name(newName){
         this._name = newName
     }
 }
//  let p = new Animal('pig')
//  console.log(p.name) //会报错 这是在类外 访问不到
let p = new Animal('Pig')
console.log(p.name)
p.name = 'Dog'
console.log(p.name)

访问器 通过对象.访问器名字 访问到 修改器 通过对象.修改器名字=新名字 进行修改

protected

保护 只能在自己和子类的内部访问到

class Animal{
    //构造器
    protected _name:string;
     constructor(name){
         this._name = name  //在自己内部访问到
     }
 }
class Pig extends Animal{
    public get name(){
        return this._name //在子类内部访问到
    }
}
let p = new Pig('wangcai')
console.log(p.name) //通过访问器访问到
let p = new Pig('wangcai')
console.log(p._name) 
//会报错 说_name是保护属性 只能在Animal类及子类中访问到
let a = new Animal('a')
console.log(a._name) 
//会报错 说_name是保护属性 只能在Animal类及子类中访问到

继承

通过extends关键字进行继承父类

class Animal{
    name:string
    // constructor(name){
    //     this.name = name
    // }
}
class Pig extends Animal{
    age:number
    constructor(age){
        super()
        this.age = age
        
    }
}
let p = new Pig(100)
console.log(p.name) //undefined
console.log(p.age) //100

当父类中没有constructor时,在子类中的constructor必须写上super(),

class Animal{
    name:string
    constructor(name){
        this.name = name
    }
}
class Pig extends Animal{
    age:number
    constructor(name,age){
        super(name)
        this.age = age
        
    }
}
let p = new Pig('wangcai',100)
console.log(p.name) //wangcai
console.log(p.age) //100

当父类中有constructor时,在子类的constructor中必须写super(),()里面的个数和父类中constructor中的个数顺序保持一致

在new Pig时会把name传到里面的name,super里面的name会传入到父类的constructor中,当p.name时,它内部没有,会去父类中找

抽象类

在类前面使用abstract关键字,抽象类不能被new,只能被继承,constructor中的值可以被继承到子类中

abstract class Person{
    name:string
    constructor(name){
        this.name = name
    }
}
let p = new Person('xiaoqiang ') //抽象类不能被new

class A extends Person{
    constructor(name){
        super(name)
    }
}
let a = new A('xiaoqiang')
console.log(a.name) //A中没有name 从父类中找

静态属性

使用static关键字 它会使用类名.xxx访问

不带static是实例属性 会使用对象.xxx访问

class Person{
    name:string;
    static age:number=200
    // constructor(name,age){
    constructor(name){
        this.name = name;
        // this.age = age //不可以使用this.xxx访问
    }
}
let p = new Person('xiaoqiag')
console.log(p.name)
console.log(p.age) //会出错
console.log(Person.age)

静态方法

使用方法和静态属性一致

class Person{
   static eat(){
        console.log('eat...')
    }
}
Person.eat()